2012-10-14 53 views
2

在我當前的項目中,我需要向ActiveRecord :: Relation添加一條記錄。我不能將它用作數組,因爲我需要在「合併」(然後,也是分頁)之後應用排序範圍。問題是我找不到以「好」的方式做到這一點的方式。用Activerecord :: Relation合併一個對象

我需要合併的關係很簡單:一個典型的友誼關聯。實質上,我需要一個與用戶和用戶的所有朋友的關係。如果我可以使用陣列,它會是這樣簡單的:

user.friends + [user] 

但我需要一個關係。現在,我使用這個範圍:

scope :user_and_friends, lambda { |user| includes(:friendships).where(Friendship.arel_table["friend_id"].eq(user.id).or(arel_table["id"].eq(user.id))) } 

但它是非常緩慢的。你可以幫我嗎?

+0

你的關係似乎很好,也許需要一個索引的地方? – rogercampos

回答

0

最後,我自己找到了解決辦法。新的範圍是這樣的:

scope :user_and_friends, lambda { |user| joins(:friendships).where(Friendship.arel_table["friend_id"].eq(user.id).or(User.arel_table["id"].eq(user.id))).group("user_id") } 

joinsincludes快得多,特別是當你有很多的記錄。這個範圍的唯一問題是joins生成的重複記錄,但是這要歸功於group

0

試試這個

scope :user_and_friends, lambda { |user| user.friends.merge(user) } 

一些關於merge method(關聯部分)。

至少你可以這樣做:

user.friends.merge(user) 
+0

它不起作用。 'NoMethodError:未定義的方法'default_scoped?'' – Gawyn

+0

用戶表是否有朋友關聯? – megas

+0

是的。如果這個「用戶」是一個對象,而不是一個關係,這個範圍的問題。可以用'User.where(「id =?」,user.id)'替換它。 但無論如何,合併工作就像一個AND。我需要一個OR。 – Gawyn

相關問題