2009-08-26 32 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