Как найти объекты модели, которые соответствуют условию атрибута, без использования итератора? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть модель Stock, которая имеет атрибут ticker.

Что я хотел бы сделать, так это найти все Stock объекты, в которых они ticker.include?('at'), без перебора всех объектов с использованием перечислителя.

Я пытался Stock.where("ticker.include?(?)", 'at'), но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

В качестве альтернативы, если вы хотите использовать только Arel и не использовать SQL.Вы можете использовать следующее:

Stock.where(Stock.arel_table[:ticker].matches('%at%'))

Вы можете сделать помощника в вашем ApplicationRecord , чтобы облегчить запрос.

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  def self.arel_attr(attr, method, *args)
    where(arel_table[attr].public_send(method, *args))
  end

end

В результате запрос:

Stock.arel_attr(:ticker, :matches, '%at%')

Полный список методов, которые вы можете вызвать, см. В документации .

0 голосов
/ 18 мая 2018

Чтобы не повторять, нужно сделать это декларативным способом: SQL. И чтобы сделать это в SQL, вам нужна особенность базового RDBMS: LIKE, ActiveRecord недостаточно (хотя я думаю, что это возможно в Arel). В любом случае, я принимаю здесь как должное две вещи: ваше поле тикера является строкой, а не массивом, а ваше RDBMS равно MySQL или Postgresql, и я выбираю

Stock.where("ticker LIKE ?", '%at%')
...