2010-03-16 76 views
2

我有一個user模型,movie模型,這個協會在user.rb(我用的has_many:通過,因爲有這兩種模式之間的其他協會):如何使用Rails查找兩個對象之間創建的最近關聯?

的has_many:has_seens
的has_many:movies_seen, :通過=>:has_seens,:source =>:電影

我試圖獲得最近創建的十個關聯has_seens的數組。

現在,我發現的唯一解決方案是抓取所有用戶,創建一個數組,每個user.has_seens找到,然後通過has_seen.created_at對數組進行排序,只保留最後10個項目...看起來像一個重操作。

有沒有更好的方法?

凱文

+0

是否有您所使用的'Movie'模型作爲連接表由'指定一個特別的原因:source'選項?當你想要一個單獨的連接模型時,通常使用':has_many:through'關聯。 – 2010-03-16 20:26:24

回答

1

您應該可以通過在has_many :has_seens關聯中添加:order子句來完成此操作,以在創建日期之前對其進行排序。然後使用一個協會擴展到聯想本身定義的方法:

class User < ActiveRecord::Base 
    has_many :has_seens, :order => 'created_at DESC' do 
    def recent(count=10) 
     all(:limit => count) 
    end 
    end 
end 

現在你可以使用user.has_seens.recent讓看到的最近的十部電影。可選地,通過不同的計數例如user.has_seens.recent(25)

順便說一句,我認爲viewings是一個不太尷尬的協會名稱比has_seens


編輯:就個人而言,我會安排一個Viewing東西加盟模式,就像這樣:

class User < ActiveRecord::Base 
    has_many :viewings 
    has_many :movies, :through => :viewings 
end 

class Viewing < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :movie 

    default_scope :order => 'created_at DESC' 

    # Recent n viewings for any user 
    named_scope :recent, lambda { |count| { :limit => count }} 
end 

class Movie < ActiveRecord::Base 
    has_many :viewings 
    has_many :users, :through => :viewings 
end 

我用的Viewing模型默認的範圍,但你可以指定如果在默認情況下查看應該由創建日期以外的其他某個屬性進行排序,則可以對關聯進行排序。

現在你可以這樣做:

# 10 most recent viewings for everyone 
recent = Viewing.recent(10) 
+0

感謝您的回答。 「最近」的方法是有幫助的,但我已經設法得到最近十個特定用戶的has_seens。我更想從數據庫中獲取最近的十個has_seens,在所有用戶之間。 – 2010-03-16 19:08:10

+0

@凱文,看我上面的編輯。 – 2010-03-16 20:51:41

0

你可以做到這一點用find:

HasSeen.find(:order => 'created_at DESC', :limit => 10) 

可以使用named_scope(內HasSeen模型)是這樣的:

named_scope :recent, :order => 'created_at DESC', :limit => 10 

,並呼籲HasSeen.recent

如果你正在尋找的用戶來說,一個簡單的(但不是最有效的,我只是不知道如何做加盟)的方式來做到這一點是recent_users = HasSeen.recent.map { |h| h.user }

如果是後者,你是什麼尋找,發表評論,我會將其清理成用戶模型的named_scope。

相關問題