每当我想避免 NxN 查询时,我都会在 Rails 中使用 includes
。但有时包含的表可能有大量字段。
因此,为了避免性能问题,我所做的是,我进行了连接,并从关联表中仅选择了必填字段。
但这根本感觉不对。虽然我不确定是什么,但我感觉像是在违反什么。
我理解当我们做includes
时,我们不能指定select
子句。我们如何在不进行连接和污染(?)对象的情况下实现这一目标。
最佳答案
没有“好的”rails 方法可以做到这一点。
就像你说的那样,将 includes
和 select
结合起来是不可能的,也没有用,因为 ActiveRecord::Base
将每个查询包装到一个对象中。这意味着只加载 id
和 name
并省略 description
和 user_id
会给你带来一个将不完整的对象保存到数据库时,可能会丢失 description
和 user_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
中提供的环境访问数据建立的连接句柄,因此您可以使用相同的独立于数据库连接模型。
关于sql - 将关联表中的几列与 SQL 连接一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21550609/