Rails - 使用或子句编写Where查询

时间:2017-01-20 05:19:17

标签: mysql ruby-on-rails activerecord

我无法通过我的Rails 5应用程序(mySQL)找出如何将查询合并到一个查询中。我希望@activities返回符合查询1或2条件的活动记录。

有人可以帮帮我吗?谢谢!

查询1

@activities = Activity.where(owner_id: current_user.friend_ids, owner_type: "User")

查询2

@activities = Activity.where(recipient_id: current_user.id)

4 个答案:

答案 0 :(得分:3)

试试这个............

@activities =  Activity.where("(owner_id in = ? and owner_type = ?) or recipent_id = ?", current_user.friend_ids,"User",current_user.id )

对于Rails 5

@activities =  Activity.where(owner_id: current_user.friend_ids, owner_type: "User").or(Activity.where(recipient_id: current_user.id))

希望这对你有用。

答案 1 :(得分:3)

尝试以下

@activities =  Activity.where("(owner_id in = ? and owner_type = ?) or recipent_id = ?", current_user.friend_ids,"User",current_user.id )

@activities =  Activity.where(owner_id: current_user.friend_ids, owner_type: "User").or(Activity.where(recipient_id: current_user.id))

答案 2 :(得分:3)

使用AREL是获取OR或AND查询的好方法,它是一种更加编程的方式来获取所需的SQL查询,因为您可以构建它们并对它们进行元编程,并且它避免使用直接的SQL字符串可能会变得太大,复杂且难以理解,但这里有一段代码可以帮助您:

table = Activity.arel_table
query = arel_table['owner_id'].in(current_user.friend_ids).and(arel_table['owner_type'].eq("User"))
query = query.or(arel_table['recipient_id'].eq(current_user.id))
@activities = Activity.where(query)

我强烈建议您查看有关使用AREL的更多信息,这里有一些页面可以查看更多内容:

definitive guide to arel
using arel to compose sql queries

修改

出于某种原因,我决定完全忽略你在跑道5的事实,在这种情况下,Akshay的回答/ Chakreshwar Sharma的第二个回答肯定是要走的路。

然而,我仍然建议学习并掌握AREL,它可以在许多其他可能有更复杂的查询要写的情况下提供帮助!

答案 3 :(得分:0)

您也可以这样使用:

# load all ids for owner
activity_ids_by_owner = Activity.where(owner_id: current_user.friend_ids, owner_type: "User").pluck(:id)
# load all ids for recipient
activity_ids_by_recipient = Activity.where(recipient_id: current_user.id).pluck(:id)

# load all activities for founded ids
Activity.where(id: activity_ids_by_owner | activity_ids_by_recipient)