Model.find_by_sql vs connection.query,哪个更好?

时间:2013-09-25 05:21:10

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

在rails中 -

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

  • 首先通过再次执行查询模型并捕获结果 -

    1. res = User.find_by_sql(“select * from customers join and conditions”)
    2. res = User.find_by_sql(“select * from [other table] join and conditions”)

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

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

也可能存在问题。

所以我认为它有很多混乱。

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

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

res = ActiveRecord::Base.connection.query("sql query") 代替查询,我们可以使用select_one,select_all,也可以进行查询参数化。

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

所以我需要对方法和需要决定哪一个更好的建议。

1 个答案:

答案 0 :(得分:2)

首先是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是否更好,因为它是一种自定义查询数据库并返回实例化对象的简单方法