2

在铁轨上-

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

  • 首先是通过对模型执行查询并捕获这样的结果-

    1. res=User.find_by_sql("select * from customers joins and conditions")
    2. res=User.find_by_sql("select * from [other table] joins and conditions")

这种方法存在问题,我对此感到不舒服,因为在用户类对象中我正在捕获其他表的数据。就像第一个查询结果有来自客户表的数据,所以在用户对象中我得到了客户的属性。更有趣的问题是 - 如果结果查询具有 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 代替查询,也可以使查询参数化。

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

所以我需要一些关于方法的建议,并且需要决定哪一个更好。

4

1 回答 1

3

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

于 2014-08-01T10:28:23.703 回答