Ruby где предложение ищет указанное c условие и значения nil вместе - PullRequest
1 голос
/ 23 марта 2020

У меня есть эта область в моей модели вариантов. Я ищу продукты, где published_on датируется не сегодня, и в то же время я ищу, где published_on равно nil. Я придумал это, но похоже, что он получает только варианты, где product.published_on не датируется сегодня. а не nil. Я хотел бы знать, что не так с моим кодом.

  scope :not_new_items, lambda {
    joins(:product).where("products.published_on < ? OR products.published_on = ?", Time.zone.now, nil)
  }

У меня также есть область для получения nil значений product.published_on, и это работает, хотя я хочу, чтобы они были в одной области действия

  scope :null_items, lambda {
    joins(:product).where(
      products: { published_on: nil }
    )
  }

Ответы [ 2 ]

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

Значение NULL указывает на недоступное или неназначенное значение. Значение NULL не равно нулю (0) и не равно пробелу (''). Поскольку значение NULL не может быть равным или не равным какому-либо значению, вы не можете выполнить какое-либо сравнение с этим значением, используя операторы, такие как '=' или '<>'.

. Таким образом, вы должны заменить = на is

  scope :not_new_items, lambda {
           joins(:product).where("products.published_on < ? OR 
      products.published_on IS ?", Time.zone.now, nil)
 }
2 голосов
/ 23 марта 2020

In Postgresql NULL не равно NULL, поэтому следующее выражение возвращает false: NULL = NULL

Чтобы проверить, является ли значение NULL или нет, вы используете вместо этого оператор IS NULL:

value IS NULL

Так что в вашем случае это будет примерно так:

scope :not_new_items, lambda {
    joins(:product).where("products.published_on < ? OR products.published_on IS NULL", Time.zone.now)
  }

Если вы посмотрите на запрос, который производит ActiveRecord для field: nil это будет SELECT "table_name".* FROM "table_name" WHERE "table_name"."field" IS NULL

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