ruby-on-rails - Model.find_by_sql 与 connection.query,哪个更好?

标签 ruby-on-rails ruby-on-rails-3

在 rails 中-

我需要对数据库执行sql查询;该查询与任何特定模型无关,它可以混合来自多个表或其他表的数据。我有办法做到这一点=-

  • 首先是通过再次执行模型查询并捕获结果,如下所示 -

    1. res=User.find_by_sql("从客户联接和条件中选择 *")
    2. res=User.find_by_sql("select * from [other table] 连接和条件")

这种方法有问题,我对此感到不舒服,因为在用户类对象中我正在捕获其他表的数据。就像第一个查询结果具有来自客户表的数据一样,因此在用户对象中我获得了客户的属性。更有趣的问题是 - 如果生成的查询具有 id 属性,则

res.first.id 将是客户的 ID, 如果用户模型与 UserRoles 模型有关系,并且如果我使用 res.first.roles 访问此关系,那么它将从 UserRole 中获取客户 ID 的角色,这是完全错误的。

也可能存在问题。

所以我认为它有很多困惑。

好的一点是我们不需要处理连接,结果将是一个对象数组。因此使用 res.first.id 访问对象属性比 row["id"] 更容易。

  • 第二种方法是使用 ActiveRecord 连接并执行查询,例如

这个res = ActiveRecord::Base.connection.query(“sql查询”) 我们可以使用 select_one、select_all 代替查询,也可以使查询参数化。

它的问题是它返回哈希数组,但我需要对象数组以便在代码中轻松访问。所以我写了一个类来将哈希转换为对象(我认为rail在后台做了同样的事情)并且工作正常。

因此,我需要对这两种方法提出一些建议,并需要决定哪种方法更好。

最佳答案

首先 find_by_sql 与 select_all

find_by_sql,该方法通过初始化对象返回一个对象数组。

users = User.find_by_sql("SELECT * FROM users"); #=>  [#, #, #, # ....]


Accessing properties
users[0].name   #Getting property in object oriented fashion

select_all,该方法返回一个对象数组,但并不初始化它们,每个对象代表数据库的一行。

users = User.connection.select_all("SELECT * FROM users"); #=>  #

Accessing properties
users[0]["name"] #Getting property in non-object oriented fashion

find_by_sql是否更好,因为它是一种自定义查询数据库并返回实例化对象的简单方法

关于ruby-on-rails - Model.find_by_sql 与 connection.query,哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18996813/

相关文章:

javascript - rails 6.1 : Webpacker can't find application. js

ruby-on-rails - Rails 单表继承问题

ruby-on-rails-3 - 为什么我的 authorize.net 交易成功却报告失败?

ruby-on-rails - 推送到 heroku 使我无法使用默认设置获取 OPENSHIFT_SECRET_TOKEN

ruby-on-rails - 比 Apache Solr 更快的搜索平台/索引引擎?

ruby-on-rails - :highest_rated scope to order by average rating

ruby-on-rails - 推送到特定 Git 存储库时排除特定文件

ruby-on-rails-3 - Factory_girl、关联和 after_initialize 的问题

ruby-on-rails - 验证失败后保留表单字段, "render"不起作用

ruby-on-rails - Rails Assets 管道在开发中连接 application.css 和 js,但在生产中不连接