Ruby on Rails:我们如何执行存储在数据库中的activerecord查询?

时间:2016-04-13 05:08:33

标签: mysql ruby-on-rails ruby activerecord

我有公式表,用于存储检索数据的公式,如下所示。

'select("clause").where(id: permitted_params[:id]).group("date(transaction_date)")'

如何在ActiveRecord上使用上述查询字符串并生成数据。

Model.(above query string)

应生成以下

Model.select("clause").where(id: permitted_params[:id]).group("date(transaction_date)")

2 个答案:

答案 0 :(得分:1)

您的方法似乎非常不安全(除非您对数据库中的查询具有绝对的,完全控制权),并且从长远来看不可维护(例如, db结构使使用它的所有查询无效,如果它们仍然可以,则需要检查所有查询。

所以,我不会这样做,但如果你坚持,你可以在模型类上使用class_eval

Model.class_eval('select("clause").where(id: permitted_params[:id]).group("date(transaction_date)')

相当于:

Model.select("clause").where(id: permitted_params[:id]).group("date(transaction_date)")

但是,我仍然投票反对这种做法:你说你需要查询不同类型的产品。通常有一种方法可以将这些信息抽象为几个属性,也许还有一些连接表。类似的东西:产品可以有许多功能,每个功能都有一个名称,类型等...这将是我的方式。长期的优势还在于您将在代码/数据库中构建产品的详细描述,这可能会在以后用于各种目的。

答案 1 :(得分:1)

正如已经指出的那样:当你有数据库更新时,这是不安全的,不实用。

执行原始SQL并将结果转换为模型的简便方法是find_by_sql

Model.find_by_sql('select * from models where some complicated nasty SQL goes here')

现在,如果您提供查询并且用户提供该查询的参数,那么这可能会有所不同。 我可能会为每个查询创建一个类并存储所有参数(由用户提供)以及要在DB中执行的查询,然后在运行时构造查询。这些方面的东西:

class QueryA
  def initialize(params)
   @params = params
  end

  def call
    SomeModel.select(clause).where(permitted_ids: permitted_ids)
  end

  private
  def clause
    params[:clause].presence_in(%w{first_valid_value second_valid_value ...})
  end
  def permitted_ids
    # access from params and whitelist
  end
end