2009-07-15 5 views
1

: 순서와 :와 함께 찾을 수는 액티브 레코드 레일 :이 같은 구조 뭔가를 그룹

class User 
    has_many :dongles 
    has_many :licences, :through => :dongles 
end 

class Dongle 
    has_many :licences 
    belongs_to :user 
end 

class Licence 
    belongs_to :dongle 
end 

그러나, 시간이 경과하고 사용자가 최종적으로 각 동글에 대해 여러 라이센스를 가져옵니다. 합리적으로, 앱은 각각에 대한 최신 라이센스를 요약하려고합니다.

user.dongles.each do |dongle| 
    licence = dongle.licences.find(:first, :order => 'created_at DESC') 
    # do something with the licence info 
end 

을하지만 일반적으로 그것을 순진 방법을 수행하여 초래 쿼리의 많은 수의 컬렉션을 통해이 작업을 수행하고 피할 수있는 방법이있다 :

나는 이런 식으로 그것을 할 순진 수있어?

나는이 시도 :

user.licences.find(:all, :order => 'created_at DESC', :group => 'dongle_id') 

이 각 동글 하나의 라이센스를 반환 않지만, 순서에 따라 첫 번째는 'ID'에 의해 결정됩니다 하나, 하지이 나는 ​​쿼리에 지정했습니다.

첫 번째인지 결정하기 위해 제공하는 정렬 순서를 사용하여 각 항목을 첫 번째로 제공 할 수있는 방법이 있습니까?

답변

3

모델에서 모든 연결 정보가 이미 선언되었습니다. ActiveRecord 을 사용하여 단일 쿼리를 수행하여 옵션을 포함하여 각 사용자를 실제로 동글 및 라이센스 정보에 액세스 할 수 있습니다.

# Say the table name is licences and dongles. 
users = User.find(:all, 
    :include => [:dongles, :licences], 
    :order => "licences.created_at DESC, dongles.created_at DESC") 

각 사용자가 소유 한 각 동글의 최신 라이센스 요약을 작성한다고 가정합니다. 실제 필요에 따라 루프를자를 수도 있습니다.

users.each do |user| 
    # do something with your user info 
    user.dongles.each do |dongle| 
    # do something with your dongle info 
    licence = dongle.licences.first 
    # do something with the licence info 
    end 
end 

http://snippets.dzone.com/posts/show/2089

+0

코드가 이미 한 것과 크게 다르지 않다하면서, 쿼리의 수를 줄일 않는이 좋은 (어쨌든 더 읽기 쉽습니다.) – Trejkaz

-1

에서 이것에 대해 자세히 알아보기 당신은 기본 범위와 시도? 먼저 사용자에게 표시된 것처럼 has_many에 주문을 추가 할 수 있습니다. 그 대신 동글에 연결에 추가 할 수 있습니다 작동하지 않을 경우 그 사실, 어쩌면하는이 일대-를 통해 협회와 함께 작동하는 경우

class User 
    has_many :dongles 
    has_many :licences, :through => :dongles, :order => 'created_at DESC' 
end 

그러나, 나는 확실하지 않다.

class Dongle 
    has_many :licences, :order => 'created_at DESC' 
    belongs_to :user 
end 

두 번째 옵션은 라이센스에 표시된대로 기본 범위로 시도하는 것입니다.

class Licence 
    default_scope :order => 'created_at DESC' 
    belongs_to :dongle 
end 

그 후 것은 그냥 그것을 얻을 충분해야입니다 user.licenses.find(:first)