2009-08-26 54 views
1

行,所以我有我的模型,像這樣:在Model.calculate方法中使用屬性?

Team 
    has_many :users, :through => memberships 

User 
    has_one :user_status 

現在在我的團隊模式,我希望能夠找到我的'user_status'車型的最大'updated_at'值。

我試圖做這樣的事情:

Team 
    has_many :users, :through => :memberships 
    has_many :user_statuses, :through => :users 

    def max_last_updated_status 
    user_statuses.maximum(:updated_at) 
    end 

但是這給了我:

Invalid source reflection macro :has_one for has_many :user_statuses, :through => :users. Use :source to specify... 

所以我想知道是否有這樣做的更好的辦法,我能創造的一個屬性用戶模型,如:

def status_updated_at 
    user_status.updated_at 
end 

,然後改變我的Team類有:

def max_last_updated_status 
    user.maximum(:status_updated_at) 
    end 

?我假設不是因爲'status_updated_at'不是真正的列,所以SQL代將會失敗...

對這個問題的另一個觀點將不勝感激。

回答

1

在你原來的做法,你有沒有試過這樣:

team.users.maximum "user_statuses.updated_at", :include => :user_status 
# OR 
team.users.maximum "`user_statuses`.updated_at", :include => :user_status 

我有以下類試圖和它工作得很好:

class User < ActiveRecord::Base 
    has_one :user_status 
    has_many :memberships 
    has_many :teams, :through => :memberships 
end 


class UserStatus < ActiveRecord::Base 
    belongs_to :user 
end 


class Team < ActiveRecord::Base 
    has_many :users, :through => :memberships 
    has_many :memberships 
end 


class Membership < ActiveRecord::Base 
    belongs_to :team 
    belongs_to :user 
end 
+0

哦,我沒有意識到你可以這樣做,但當你添加包含時,它當然是有意義的,我可以看到SQL是如何生成的。非常感謝! – neiled 2009-08-26 18:58:51

3

我會做這種方式:

has_many :users, :through => memberships 

def max_last_updated_status 
    users.map{|user| user.user_status.updated_at}.max 
end 

用戶

has_one :user_status 

的方法max_last_updated_status應返回最大的updated_at在隊中的用戶。

+0

我喜歡這個答案,它只是透視我的變化需要。放棄思考SQL並開始思考Ruby。我已經像這樣實現了。非常感謝。 – neiled 2009-08-26 18:57:58