我正在尝试在我的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
我希望这是有意义的,并提前感谢
答案 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)