2012-12-01 3 views
0

에 가입하여 기록을 수집 내가 가지고있는 두 테이블루비 - Datamapper - 두 모델

users 
------- 
id 
name 
organization_id 


organizations 
---------- 
id 
org_name 
org_unique_num 
abc 
xyz 

organization_id 사용자 테이블 조직 테이블의 ID에 대한 외부 키

class Organization 
    include DataMapper::Resource 
    property :id, Serial 
    property :org_name, String 
    property :org_unique_num, Integer 
    property :abc String 
    property :xyz String 
    has n, :users 
end 

class User 
    include DataMapper::Resource 
    property :id, Serial 
    property :name, String 
    property :organization_id, Integer 
    property :age, Integer 
    belongs_to :organization 
end 

내가 함께 사용자의 기록을 잡아 할 것입니다 사용자의 나이가 25 이상인 조직 테이블에 합류합니다. 결과는 다음과 같습니다.

user_id name organization_id org_name org_unique_num age 
12   John  356    ATT   76763   38 
35   Lisa  981    IBM   2376   28 

그럼 어떻게해야합니까? 내가 abc와 xyz 열을 결과에 넣고 싶지 않다는 것에주의하십시오.

User.all(:age.gt => 25) 

이것은 단지 나에게 나이> 25 사용자를 줄 것이다,하지만 난뿐만 아니라 사용자의 조직 정보를 잡고 싶다. 그것은 하나의 진술을 할 수 있습니까? 또는 여러 단계로 수행해야합니다. 모든 user_id를 수집 한 다음 id가() 인 조직 모델에 전달하면 추한 것입니다.

도움이 될 것입니다.

답변

2

DataMapper는 모든 가입 작업을 수행합니다.

각 사용자에 대한 조직을 추출 할 필요가 없습니다. 이는 자동으로 수행됩니다. 그들이 경우,

User.all(:age.gt => 25).each do |user| 
    p user.name 
    # organization not yet fetched, only referenced 
    p user.organization 
    # now organization are fetched 
    p user.organization.id  # display org ID 
    p user.organization.org_name # display org name 
    # etc 
end 

시선은 "내가 abcxyz 필요하지 않습니다"User.all(:age.gt => 25)

을 그리고 각 사용자는 조직에 연결된 것 :

그래서, 당신은 단순히이와 사용자를 가져 Text 열이면 DataMapper가 지연로드하여 user.abc

+0

@ silvu까지 요청한 경우에만 데이터를 가져옵니다. 그것은 효과가 있었다. 그건 그렇고, 조직을 "eager-load"로 유지할 수있는 방법이 있습니까? – JVK

+0

User 클래스에 메소드를 작성하면 어떨까요? 예 : 'def getwithorg 쿼리 finalhash = {} r = 모두 (쿼리) r.each do | user | finalhash [user.id = user.organization.org_name ..... 단부 finalhash end' – JVK

+0

또는 monkeypath'상기 방법 all' 방법. 무엇을 당신은 – JVK

관련 문제