Rails находят с условием ID NOT IN, как поддерживать нулевое значение отображения? - PullRequest
3 голосов
/ 23 марта 2012

Я хочу показать пользователю все группы, членами которых он в данный момент не является.Приведенное ниже работает нормально, когда пользователь входит хотя бы в одну группу:

Group.find(:all, :conditions => ['id not in (?), @groups.map(&:id)])

Это происходит сбой, когда пользователь входит в 0 групп, а @groups.map(&:id) имеет значение null. Как я могу обновить приведенное выше для поддержкислучай использования, когда @ groups.map (&: id) имеет значение null / nill в ruby ​​на рельсах?

Спасибо

Ответы [ 4 ]

5 голосов
/ 23 марта 2012

Rails 3 включает в себя ARel, который позволяет вам создавать кусочные функции. Это очень удобно в таких обстоятельствах.

scope = Group
group_ids = @groups.map(&:id)
scope = scope.where(['id not in (?)', group_ids]) unless group_ids.empty?
scope.all

Это будет включать только условие NOT IN, если есть идентификаторы групп, которые нужно исключить. Если исключаемые группы пусты, они не будут включены в запрос.

2 голосов
/ 23 марта 2012

Простой обходной путь:

Group.where(['id NOT IN (?)', @groups.map(&:id).presence || [0]])

Используя Arel, он работает как положено, без всяких взломов:

Group.where(Group.arel_table[:id].not_in(@groups.map(&:id)))
1 голос
/ 31 декабря 2015

Поскольку на этот вопрос нет общепринятого ответа, опубликую, что мне помогло на Rails 2.3 и Ruby 1.9.3:

Group.find(:all, :conditions => ['id not in (?), @groups.map(&:id).join(",")])

1 голос
/ 24 марта 2012

Это, вероятно, относится к области:

class Group < ActiveRecord::Base
  scope :search_excluding_ids, lambda { |g| 
      g.present? ? where(['id not in (?)', group_ids]) : {}
  }
end

Group.search_excluding_ids(ids)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...