有没有办法将Rails中的where和where.not组合成一个条件?

时间:2016-08-11 10:40:19

标签: sql ruby-on-rails activerecord orm

我有一个Event模型,里面有user_id。我想选择此模型的所有对象,具有指定的user_id但不包括特定事件。所以我可以用这样的查询来做到这一点:

Event.where(user_id: user.id).where.not(id: id)

但是我可以将这两个where函数组合成一个吗?

我知道如果我需要查找具有指定iduser_id s的事件,我可以这样做:

Event.where(user_id: user_id).where(id: id)

我可以使用一个where调用来压缩它,而不是两个:

Event.where(user_id: user_id, id: id)

但如果我使用wherewhere.not,我可以做同样的事情吗?

3 个答案:

答案 0 :(得分:1)

您可以按照以下方式编写,以添加where.not:

Event.where(
  "user_id = ? AND id != ?",
  user.id,
  id
)

所以如果user_id = 1且id = 2 比这将返回user_id 1且没有id 2的记录:)

答案 1 :(得分:0)

试试这个,你可以创建两个范围,然后在链中调用

scope :with_user, ->(user) {user_id: user.id}

scope :excluded_event, ->(event_ids) { where.not(id: event_ids) }

Event.with_user(user).excluded_event(event_ids)

答案 2 :(得分:0)

你可以收集

Event.where(user_id: 1) + Event.where.not(id: 2)

或拒绝参数

Event.where(user_id: 1).where.not(id: 2)