Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
Mysql 如何从原始sql查询中获取ActiveRecord模型实例?_Mysql_Sql_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Mysql 如何从原始sql查询中获取ActiveRecord模型实例?

Mysql 如何从原始sql查询中获取ActiveRecord模型实例?,mysql,sql,ruby-on-rails,ruby,activerecord,Mysql,Sql,Ruby On Rails,Ruby,Activerecord,在Rails中,我有时想使用MySQL进行查询,这对于ActiveRecord方法来说太复杂了。因此,我通常会执行以下操作以获取哈希数组: query = "SELECT * FROM ..." result = ActiveRecord::Base.connection.exec_query.to_a 通常情况下,我可以这样做,但有时我仍然希望为我的模型创建一个实例数组,以便将它们用于CRUD 在这种情况下,我尝试了以下方法: result.map{|u| User.new(u)} 在我

在Rails中,我有时想使用MySQL进行查询,这对于ActiveRecord方法来说太复杂了。因此,我通常会执行以下操作以获取哈希数组:

query = "SELECT * FROM ..."

result = ActiveRecord::Base.connection.exec_query.to_a
通常情况下,我可以这样做,但有时我仍然希望为我的模型创建一个实例数组,以便将它们用于CRUD

在这种情况下,我尝试了以下方法:

result.map{|u| User.new(u)}
在我尝试创建、保存或更新之前,这一切都很正常。当这种情况发生时,我会收到一个错误,告诉我已经存在具有相同ID的记录

不知何故,ActiveRecord已经知道如何使用它能够构造的查询来实现这一点。我如何做同样的事情,并使其成为一个复杂的原始查询,以便将其转换为一组模型实例,从而改变表,而不是试图插入并失败?

使用例如

执行
result.map{u|User.new(u)}
的问题在于,这会创建新的
User
对象,这些对象的属性取自
exec_query
返回的散列,但这些对象被视为新的、未保存的活动记录模型,因此,如果您试图持久化它们,就会与现有记录发生冲突


也就是说,Active Record查询接口非常灵活,因此值得发布一些查询示例,看看这些查询是否可以在不使用原始SQL的情况下建模。

您可以通过调用类中的

User.find_by_sql('select users.* from users ... ')
或者,您也可以从查询中标识的ID向用户发送:

query = "SELECT id FROM users WHERE..."

user_ids = ActiveRecord::Base.connection.exec_query.to_a

User.find(user_ids)

哇,我甚至忘了那个方法的存在。我喜欢这个答案,尽管我能看到的唯一问题是使用聚合函数或嵌套查询来创建额外属性似乎不起作用。使用我提出的方法,我可以向我的用户模型中添加一个attr\u访问器,以便像post\u count这样的内容可以作为属性返回。但大多数情况下,如果我在执行插入操作,我就不需要这样做,所以这应该没什么大不了的。对于其他一些情况,建议运行查询来查找ID,然后再运行一个单独的
模型。find
也会很有用。
query = "SELECT id FROM users WHERE..."

user_ids = ActiveRecord::Base.connection.exec_query.to_a

User.find(user_ids)