【问题标题】:Using few columns from associated table with a SQL Join将关联表中的几列与 SQL 连接一起使用
【发布时间】:2014-02-04 11:00:55
【问题描述】:

每当我想避免 NxN 查询时,我都会在 Rails 中使用includes。但有时包含的表可能有大量字段。

因此,为了避免性能问题,我要做的是进行联接,然后从关联的表中只选择必填字段。

但这感觉完全不对。虽然我不确定是什么,但我感觉好像违反了什么。

我了解当我们执行includes 时,我们无法指定select 子句。我们如何在不进行连接和污染(?)对象的情况下实现这一点。

【问题讨论】:

    标签: sql ruby-on-rails database oop


    【解决方案1】:

    没有“好的”rails 方法可以做到这一点。 就像你说的那样,将includesselect 结合起来是不可能的,也没有用处,因为ActiveRecord::Base 将每个查询包装到一个对象中。这意味着仅加载 idname 而忽略 descriptionuser_id 会导致您在保存不完整对象时可能会丢失 descriptionuser_id 的内容到数据库。

    因此,您只能使用纯 sql 来执行此操作,并忽略 ActiveRecord 的对象映射,这样您就不会面临丢失数据的危险。您也可以通过ActiveRecord 建立的数据库连接来做到这一点,如下所示:

    ActiveRecord::Base.connection.execute("SELECT id,name FROM table_name WHERE <conditions>").each do |row|
      row["id"]  #access id of each result
    end
    

    ActiveRecord::Base.connection 包含通过使用您的config/database.yml 中提供的环境访问数据建立的连接的句柄,因此您可以独立使用相同的数据库连接模型。

    【讨论】:

    • 谢谢。 eager_load 解决方案怎么样?看起来还不错吧?
    • 是的,它绝对是解决这个问题的更干净的解决方案,但您可能会遇到速度比漂亮的 ruby​​ 代码更重要的地步。
    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多