Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL联接关联表中的几列_Sql_Ruby On Rails_Database_Oop - Fatal编程技术网

使用SQL联接关联表中的几列

使用SQL联接关联表中的几列,sql,ruby-on-rails,database,oop,Sql,Ruby On Rails,Database,Oop,每当我想避免NxN查询时,我都会在Rails中使用includes。但有时包含的表可能有大量字段 因此,为了避免性能问题,我做的是进行联接,并从关联表中仅选择必需的字段 但这感觉一点也不对。虽然我不知道是什么,但我觉得自己违反了某些规定 我理解当我们执行包含时,我们不能指定选择子句。我们如何在不连接和污染对象的情况下实现这一点。没有“好”的rails方法可以做到这一点。 正如您所说,将includes和select组合起来是不可能的,也是没有用的,因为ActiveRecord::Base将每个查

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

因此,为了避免性能问题,我做的是进行联接,并从关联表中仅选择必需的字段

但这感觉一点也不对。虽然我不知道是什么,但我觉得自己违反了某些规定

我理解当我们执行
包含
时,我们不能指定
选择
子句。我们如何在不连接和污染对象的情况下实现这一点。

没有“好”的rails方法可以做到这一点。 正如您所说,将
includes
select
组合起来是不可能的,也是没有用的,因为
ActiveRecord::Base
将每个查询包装到一个对象。这意味着仅加载
id
name
并省略
description
user\u id
,例如,将不完整的对象保存到数据库时,可能会丢失
description
user\u 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.execute(“从表中选择id、名称”\u name WHERE”)。每行|
行[“id”]#每个结果的访问id
结束

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

谢谢。那么,
eager\u load
解决方案呢?这似乎相当正确?是的,它确实是这个问题的更干净的解决方案,但您可能会达到这样一个程度:速度比漂亮的ruby代码获得更高的优先级。