如何在不使用迭代器的情况下找到适合属性条件的模型对象?

时间:2018-05-17 21:47:21

标签: ruby-on-rails ruby ruby-on-rails-5 rails-activerecord

我有Stock模型,其属性为ticker

我想要做的是找到Stock所有ticker.include?('at')个对象,而不使用枚举器迭代所有对象。

我试过Stock.where("ticker.include?(?)", 'at'),但无济于事。

2 个答案:

答案 0 :(得分:3)

要不迭代,您需要以声明方式执行:SQL。要在SQL中执行此操作,您需要基础RDBMS的一项功能:LIKEActiveRecord是不够的(我认为可以在Arel中使用RDBMS )。 无论如何,我在这里理所当然地认为两件事:你的自动收报机字段是一个字符串,而不是一个数组,而你的MySQLPostgresqlStock.where("ticker LIKE ?", '%at%') ,我选择了

JSoup.connect().get()

答案 1 :(得分:1)

或者,如果您只想使用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%')

有关您可以调用的方法的完整列表,请查看documentation