每当我想避免NxN查询时,我在Rails中使用includes
。但有时包含的表可能包含大量字段。
为了避免性能问题我做的是,我做了一个连接,我只选择了相关表中的必填字段。
但这根本感觉不对。虽然我不确定是什么,但我觉得自己有所侵犯。
我理解当我们执行includes
时,我们无法指定select
子句。如何在不进行连接和污染(?)对象的情况下实现这一目标。
答案 0 :(得分:1)
没有“漂亮”的轨道方式来做到这一点。
就像你说的那样,组合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
中提供的环境访问数据建立的连接句柄,因此您可以独立使用相同的数据库连接模型。