【问题标题】:Instantiate STI inherited-model results from exec_query从 exec_query 实例化 STI 继承模型结果
【发布时间】:2019-01-29 21:30:10
【问题描述】:

给定这个返回哈希的查询:

def query
  sql = %(SELECT * FROM components
          INNER JOIN brands_components ON brands_components.component_id = components.id
          INNER JOIN brands ON brands.id = brands_components.brand_id
          INNER JOIN components_templates ON components.id = components_templates.component_id
          WHERE components_templates.template_id = #{@template.id}
          AND (components.user_id IS null OR components.user_id = #{@user.id})
          AND brands.id = #{@user.brand_id})
  ActiveRecord::Base.connection.exec_query(sql)
end

如何将结果实例化为 ActiveRecord 集合(特别是如果它们代表不同的模型 [即,从 Component 继承的 STI])?

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord ruby-on-rails-5


    【解决方案1】:

    将 sql 传递给 find_by_sql 将实例化模型,因此将方法更改为

    def query
      sql = [some sql]
      Component.find_by_sql(sql)
    end
    

    应该给你你想要的。它还将为每条记录实例化正确的子类。

    【讨论】:

    • 这里的文档说“如果你调用一个跨越多个表的复杂 SQL 查询,则 SELECT 指定的列将是模型的属性,无论它们是否是相应表的列。 "如果将语句更改为 SELECT components.* 以防止来自连接表的噪音,这似乎会忽略子类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多