ActiveRecord де поле =? масив можливих значень


Відповіді:


163

Від тут вона , як видається, зробити з допомогою SQL - inоператор:

Model.where('id IN (?)', [array of values])

Або простіше, як зазначив kdeisz (Використання Arel для створення запиту SQL):

Model.where(id: [array of values])

6
Це можна спроститиModel.where(id: [array of values])
kddeisz

Model.where ("id in (?)", [1..8]), здається, не працює для мене. будь-які ідеї?
BKSpurgeon

Вам не потрібні квадратні дужки, 1..8це вже схоже на масив.
Уілл Річардсон

1
Чи буде цей синтаксис автоматично уникати одинарних лапок у [масиві значень]?
WiredIn

1
Коли мій масив досить великий, метод витрачає багато часу. Як ви могли це зробити за допомогою справді великих масивів?
jgomo3,


6

Для читабельності це можна ще спростити, щоб:

Model.find_by(id: [array of values])

Це еквівалентно використанню where, але більш чітке:

Model.where(id: [array of values])

find_byнасправді є where().take. Model.find_by(id: [1, 2, 3])повернеться лишеModel(id: 1)
Джеймс. Олівер

ще один варіант, якщо шукати лише один запис замість масиву, що відповідає критеріям,find_by_id([1, 2, 3])
Стів

2

Ви можете використовувати оператор 'in':

Model.in(id: [array of values])


0

Існує "невелика" різниця між де і find_by .

find_by поверне лише один запис, якщо знайдений, інакше буде нуль.

Знаходить перший запис, що відповідає зазначеним умовам. Немає неявного замовлення, тому, якщо порядок має значення, ви повинні вказати його самостійно. Якщо жодного запису не знайдено, повертає нуль.

  def find_by(*args)
      where(*args).take
    rescue RangeError
      nil
  end

тим часом де це поверне відношення

Повертає нове відношення, яке є результатом фільтрації поточного відношення відповідно до умов аргументів.

Отже, у вашій ситуації відповідний код:

Model.where(id: [array of values])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.