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

Rav*_*ine 2 ruby mysql sql activerecord ruby-on-rails

在Rails中,我有时想用MySQL进行查询,这对于ActiveRecord方法来说太复杂了.所以我通常会做以下操作来获取一系列哈希:

query = "SELECT * FROM ..."

result = ActiveRecord::Base.connection.exec_query.to_a
Run Code Online (Sandbox Code Playgroud)

通常情况下,我可以逃避这种情况,但有时候我仍然想要一个模型的实例数组,所以我可以将它们用于CRUD.

在那种情况下,我试过这个:

result.map{|u| User.new(u)}
Run Code Online (Sandbox Code Playgroud)

这工作正常,直到我尝试创建,保存或更新.当发生这种情况时,我收到一个错误,告诉我已经存在具有相同ID的记录.

不知何故,ActiveRecord已经知道如何使用它能够构造的查询来完成这项工作.我怎样才能做同样的事情并使其成为可以将一个复杂的原始查询转换为一组模型实例,这些实例将改变表而不是试图插入和失败?

mik*_*kej 7

使用find_by_sql例如

User.find_by_sql("SELECT * FROM user...")
Run Code Online (Sandbox Code Playgroud)

这样做的麻烦result.map{|u| User.new(u)}在于,这会创建User具有从返回的哈希值中获取的属性的新对象,exec_query但这些属性被视为新的未保存的Active Record模型,因此如果您尝试保留它们,则会与现有记录冲突.

也就是说,Active Record查询界面非常灵活,因此值得发布一些您需要查询的示例,以查看是否可以在不使用原始SQL的情况下对这些查询进行建模.