2009-08-26 2 views
1

OK 그래서 난 그렇게처럼 내 모델을 가지고 : 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 

다음이 내 팀 클래스를 변경 :

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

오, 나는 당신이 그것을 할 수 있다는 것을 깨닫지 못했지만, 물론 include를 추가 할 때 SQL이 어떻게 생성되는지 볼 수 있습니다. 고마워요! – neiled

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

, 그것은 관점 I 단지 변화의 필요합니다. 생각하는 SQL에서 벗어나 루비에 대해 생각하기 시작하십시오. 나는 이것을 이렇게 구현했습니다. 고마워. – neiled

관련 문제