在我当前的项目中,我需要向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 :(得分: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") }
joins
比includes
快得多,特别是当您有大量记录时。此范围的唯一问题是joins
生成的重复记录,但由于group
而得到解决。