Активная проверка записи, если атрибут находится в массиве на основе другого атрибута - PullRequest
0 голосов
/ 20 сентября 2018

В моем проекте Ruby on Rails у меня есть модель Message с атрибутом direction как «входящий» или «исходящий».Другим атрибутом для Message является body, который представляет фактическое содержание сообщения.Я использую рельсы 5.1.2.

Теперь я хочу выбирать сообщения, исключая входящие сообщения, чье тело находится в массиве, скажем, ['a','b','c'].

Например, если в моей базе данных есть следующие сообщения:

{direction: 'outgoing', body: 'a'}
{direction: 'outgoing', body: 'b'}
{direction: 'outgoing', body: 'd'}
{direction: 'incoming', body: 'd'}
{direction: 'incoming', body: 'c'}

Я хочу выбрать только сообщения, кроме последнего, т.е. {direction: 'incoming', body: 'c'}

Я пытался

Message.where.not(["direction = ? and body != ?","incoming","['a','b','c']"]) Это вернуло мне только исходящие сообщения, но входящее сообщение с телом "d" отсутствует.

Есть предложения?Благодарю.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вместо! = Я думаю, что вы ищете синтаксис IN () для совпадений в теле.

   [25] pry(main)> Message.where.not("direction = ? and body in (?)", "incoming", ['a','b','c'])
  Message Load (0.3ms)  SELECT "messages".* FROM "messages" WHERE (NOT (direction = 'incoming' and body in ('a','b','c')))
=> [#<Message:0x007fee8b29a690 id: 1, direction: "outgoing", body: "a", created_at: Thu, 20 Sep 2018 17:02:35 UTC +00:00, updated_at: Thu, 20 Sep 2018 17:02:35 UTC +00:00>,
 #<Message:0x007fee8b29a3e8 id: 2, direction: "outgoing", body: "b", created_at: Thu, 20 Sep 2018 17:02:35 UTC +00:00, updated_at: Thu, 20 Sep 2018 17:02:35 UTC +00:00>,
 #<Message:0x007fee8b299fb0 id: 3, direction: "outgoing", body: "d", created_at: Thu, 20 Sep 2018 17:02:35 UTC +00:00, updated_at: Thu, 20 Sep 2018 17:02:35 UTC +00:00>,
 #<Message:0x007fee8b299d58 id: 4, direction: "incoming", body: "d", created_at: Thu, 20 Sep 2018 17:02:35 UTC +00:00, updated_at: Thu, 20 Sep 2018 17:02:35 UTC +00:00>]
0 голосов
/ 20 сентября 2018

Согласно описанию, упомянутому в посте, вы хотите отклонить элементы, используя sql для объекта массива.

Для этого измените запрос, чтобы принять массив в качестве аргумента вместо строки, как упомянуто в посте.

Message.where.not("direction = ? and body IN (?)","incoming",['a','b','c'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...