将对象与Activerecord :: Relation合并

时间:2012-10-14 22:08:14

标签: ruby-on-rails ruby-on-rails-3

在我当前的项目中,我需要向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))) }

但它非常缓慢。你能救我吗?

2 个答案:

答案 0 :(得分:0)

试试这个

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

关于merge method(关联部分)。

至少你可以这样做:

user.friends.merge(user)

答案 1 :(得分: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而得到解决。