我有公式表,用于存储检索数据的公式,如下所示。
'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)")
答案 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