【问题标题】:Sort 2 ActiveRecord arrays depending on :user_id and then merge into 1根据 :user_id 对 2 个 ActiveRecord 数组进行排序,然后合并为 1
【发布时间】:2013-12-03 07:13:53
【问题描述】:

我正在尝试在我的 Rails 应用程序中建立用户之间的“交友”功能。 当用户发出好友请求时,会创建一个新的“好友”项:

@friend = Friend.create(:user_id => session[:user_id], :friend_id => params[:friend_id], :status => "pending")

然后其他用户 (:friend_id) 可以接受或拒绝该请求。接受时,状态更改为“已接受”,一切正常。

我现在正在尝试返回朋友列表,但我遇到的问题是 Friend 项目可以在 :user_id 或 :friend_id 中保存朋友 ID,具体取决于发起请求的人。

我将返回所有在 :user_id 或 :friend_id 中具有登录用户 ID 的 Friend 项目,但我无法将它们分类为 1 个非当前登录用户的用户列表(即朋友用户)登录用户的)一旦我有了这些朋友项目。这就是我目前所拥有的,希望它能让您了解我正在尝试做的事情。

@stalked = Friend.where(:user_id => session[:user_id], :status => "accepted")
# @stalked_friends = Users where id == :friend_id in @stalked list
@stalkers = Friend.where(:friend_id => session[:user_id], :status => "accepted")
# @stalker_friends = Users where id == :user_id in @stalkers list
@friends = @stalked_friends + @stalker_friends

我希望这是有道理的,并在此先感谢

【问题讨论】:

  • 您希望最终的friendsUserFriend 对象的数组吗?也请查看我的答案。
  • 如果您改为为每个友谊创建两条记录,一条在“每个方向”,那么这将是一个简单的问题,即“用户通过 UserFriends 拥有多个朋友”关联。
  • @DavidAldridge 我想知道这是否会更好,但我对此很陌生,并认为创建两条记录会被归类为重复自己?不过感谢您的提示-肯定会更容易

标签: mysql ruby-on-rails activerecord merge


【解决方案1】:

我已经在一小部分数据上进行了尝试,它运行良好,它应该工作!

cuid = session[:user_id]
query = %Q{SELECT DISTINCT users.*
FROM users,friends 
WHERE (friends.user_id = #{cuid} OR friends.friend_id = #{cuid}) 
AND (friends.user_id = users.id OR friends.friend_id = users.id)
AND (friends.status = 'accepted')
AND (users.id != #{cuid})
}

@friends = User.find_by_sql(query)

【讨论】:

  • 您正在检索用户而不是朋友对象
  • @MrYoshiji 这就是他想要的,检查问题末尾的演示,你会注意到这一点。
  • @TamerShlash 有效.. 谢谢.. 这到底是做什么的?我是否认为它正在获取相关朋友表中引用的所有用户,然后排除与 cuid 匹配的用户? (我有很多东西要学 - 我知道)
【解决方案2】:

应该这样做:

@friends = Friend.where("#{Friend.table_name}.id <> ?", session[:user_id])
                 .where(status: 'accepted')
                 .where("#{Friend.table_name}.user_id = :id OR #{Friend.table_name}.friend_id = :id", id: session[:user_id])

这个@friends仍然是一个ActiveRecord::Relation对象,所以你可以在之后做范围链,添加更多的where子句,添加一个订单策略等等。

@friends = [logic before]

# reorder the friends list by id
@friends = @friends.order(:id)
# limit the friends list to 20 max
@friends = @friends.limit(20)

【讨论】:

  • 感谢您的建议,但我想我的问题可能有点不清楚。我确实希望用户.. 除了当前登录的用户之外,朋友中提到的所有用户实际上都加入了(直到我看到 Tamers 的回答,我才这么想)。我仍然不知道您可以像这样将多个 Wheres 链接在一起。感谢您的提示。
猜你喜欢
  • 2019-06-09
  • 2023-03-18
  • 2018-03-30
  • 2016-09-23
  • 2013-11-05
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
相关资源
最近更新 更多