Mysql RubyonRails:我们如何执行存储在数据库中的activerecord查询?

Mysql RubyonRails:我们如何执行存储在数据库中的activerecord查询?,mysql,ruby-on-rails,ruby,activerecord,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(tra

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

'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)")

您的方法似乎非常不安全(除非您对数据库中的查询拥有绝对的、完全的控制权),而且从长远来看,不太可维护(例如,数据库结构的更改会使所有使用它的查询失效,如果它们仍然正常,您需要检查所有查询)

因此,我不会这样做,但如果您坚持,您可以在模型类上使用:

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)")

但我仍然反对这种方法:你说你需要查询不同类型的产品。通常有一种方法可以将这些信息抽象为几个属性,也许还有一些联接表。比如:一个产品可以有很多功能,每个功能都有名称、类型等。。。这将是我的出路。长期优势还在于,您可以在代码/db中构建产品的详细描述,这在以后的各种用途中可能会很方便。

正如已经指出的那样:当您有db更新时,这是不安全的,不实用的

执行原始SQL并将结果转换为模型的简单方法是
find\u by\u SQL

Model.find_by_sql('select * from models where some complicated nasty SQL goes here')
现在,如果您提供了查询,并且用户提供了该查询的参数,那么这可能有点不同。 我可能会为每个查询创建一个类,并存储所有参数(由用户提供)以及要在数据库中执行的查询,然后在运行时构造查询。大致如下:

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

在model中使用scope我有一个类似于json的表,它存储不同种类的产品信息,我需要为不同的产品使用不同的子句集来查询数据。因为我们有动态表单来创建不同类型的产品,所以我们需要根据需求使用不同的子句来检索产品信息。所以范围在这里是没有帮助的。你要想做到这一点会很困难,为什么不好好想想呢?您可以存储查询和动态构建所需的参数,但您不能存储代码然后尝试执行它,最接近的方法是使用send方法。好的方面@Rubio,我将使用动态查询构建。谢谢:)