2013-03-04 69 views
0

所以我有一個自引用rails模型。在這個模型中,用戶有很多朋友,並且所有用戶都有狀態。我希望用戶能夠獲取其他用戶的狀態。但是由於遞歸方法調用,我遇到了堆棧溢出錯誤。Rails自引用has_many通過自我

class User 
    has_many :statuses 

    has_many :friendships 
    has_many :friends, :through => :friendships 

end 

我希望能夠說

class User 
    has_many :statuses 

    has_many :friendships 
    has_many :friends, :through => :friendships 
    has_many :friend_statuses, :through => :friends, :class_name => :statuses 
end 

然而,這顯然是創建一個遞歸調用,從而導致SO。有什麼方法可以以語義,RESTful的方式獲取所有朋友的狀態?

回答

1

你可以做的方法在你的用戶模型像你想要做這個

def friends_statuses 
    Status.where(user_id: friends.pluck(:id)) 
end 

不太方式,但我認爲它會工作。

1

創建關聯是強制性的嗎?我想,你可以在控制器本身中獲取朋友的狀態。喜歡的東西:

@user = User.find(some_id_here) 
@friends = @user.friends.includes(:statuses) 

,然後你可以通過@friends只是重複,以獲得儘可能狀態:

@friends.each do |friend| 
    friend.status.each do |status| 
    #do something with friend and status 
    end 
end 

希望是有道理的你!

+0

雅,我試圖避免無關的方法和迭代。但我想我必須這樣做。 – OneChillDude 2013-03-04 15:17:26

+0

無論你使用什麼方法,你都必須迭代通過朋友來獲得他的狀態。你唯一能做的就是減少查詢次數,這就是我的例子。 – 2013-03-04 15:48:45