根据以下内容对2个ActiveRecord数组进行排序:user_id然后合并为1

时间:2013-11-19 16:15:31

标签: mysql ruby-on-rails activerecord merge

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

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

然后,其他用户(:friend_id)可以接受或拒绝该请求。接受后,状态将更改为“已接受”,所有这些都可以正常工作。

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

我将返回所有具有登录用户ID的朋友项目:user_id或:friend_id但我无法将这些项目排序为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

我希望这是有意义的,并提前感谢

2 个答案:

答案 0 :(得分:1)

这应该这样做:

@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)

答案 1 :(得分: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)