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

Ruby on rails 如何在不使用迭代器的情况下找到符合属性条件的模型对象?,ruby-on-rails,ruby,ruby-on-rails-5,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 5,Rails Activerecord,我有一个Stock模型,它有一个ticker属性 我想做的是找到所有Stock对象,它们的ticker.include?('at'),而不使用枚举器迭代所有对象 我尝试了Stock.where(“ticker.include?(?),'at'),但没有效果。要不迭代,需要以声明方式执行:SQL。要在SQL中实现这一点,您需要底层RDBMS的一个特性:像,ActiveRecord是不够的(但我认为在Arel中是可能的)。 无论如何,我认为这里有两件事是理所当然的:你的ticker字段是一个字符串,

我有一个
Stock
模型,它有一个
ticker
属性

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


我尝试了
Stock.where(“ticker.include?(?),'at')
,但没有效果。

要不迭代,需要以声明方式执行:
SQL
。要在
SQL
中实现这一点,您需要底层
RDBMS
的一个特性:
ActiveRecord
是不够的(但我认为在
Arel
中是可能的)。 无论如何,我认为这里有两件事是理所当然的:你的ticker字段是一个字符串,而不是一个数组,你的
RDBMS
MySQL
Postgresql
,我选择

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

要避免迭代,您需要以声明方式执行:
SQL
。要在
SQL
中实现这一点,您需要底层
RDBMS
的一个特性:
ActiveRecord
是不够的(但我认为在
Arel
中是可能的)。 无论如何,我认为这里有两件事是理所当然的:你的ticker字段是一个字符串,而不是一个数组,你的
RDBMS
MySQL
Postgresql
,我选择

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

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

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

或者,如果希望仅使用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

有关可以调用的方法的完整列表,请查看数据库中的。

什么类型是
ticker
,哪个数据库?@muistooshort
ticker
string
。数据库中的
ticker
是什么类型,哪个数据库?@muistooshort
ticker
string
。或者
Stock.where('ticker like?','%at%')
,次要的一点,但与问题更接近。我这样写,但后来我认为对于固定字符串也是一样的。有什么区别吗?很好。谢谢!没有有效的区别,只是一堆习惯相互强化。或者
股票。where('ticker like?','%at%'))
,小点但与问题更接近。我是这样写的,但后来我认为对于固定字符串也是一样的。有什么区别吗?很好。谢谢!没有什么有效的区别,只是一堆习惯相互强化。