代码之家  ›  专栏  ›  技术社区  ›  marcamillion blelump

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

  •  0
  • marcamillion blelump  · 技术社区  · 6 年前

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

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

    我试过了 Stock.where("ticker.include?(?)", 'at') 但没有用。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Ursus    6 年前

    要避免迭代,您需要以声明的方式进行: SQL .并且在 SQL ,您需要底层的一个功能 RDBMS : LIKE , ActiveRecord 这还不够(我认为这是可能的) Arel 尽管如此)。 无论如何,我认为这里有两件事是理所当然的:你的ticker字段是一个字符串,而不是一个数组,你的 关系数据库 MySQL Postgresql ,我喜欢

    Stock.where("ticker LIKE ?", '%at%')
    
        2
  •  1
  •   3limin4t0r    6 年前

    或者,如果你想使用Arel和no。您可以使用以下选项:

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

    你可以在你的工作中成为一名助手 应用记录 以简化查询。

    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 .