使用ActiveRecord获取列名称

Abd*_*bdo 39 activerecord ruby-on-rails

有没有办法用ActiveRecord获取实际的列名?

当我使用连接调用find_by_sql或select_all时,如果存在具有相同名称的列,则第一个被覆盖:

select locations.*, s3_images.* from locations left join s3_images on s3_images.imageable_id = locations.id and s3_images.imageable_type = 'Location' limit 1
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我得到以下内容:

#<Location id: 22, name: ... 
>
Run Code Online (Sandbox Code Playgroud)

其中id是最后一个s3_image的id.select_rows是唯一按预期工作的东西:

Model.connection.select_rows("SELECT id,name FROM users") => [["1","amy"],["2","bob"],["3","cam"]]
Run Code Online (Sandbox Code Playgroud)

我需要获取上面行的字段名称.这篇文章接近我想要的但看起来过时了(fetch_fields似乎不再存在你如何获得ActiveRecord查询结果中的行和列?)

ActiveRecord连接方法创建多个对象.我正在尝试实现相同的结果"包含"将返回但是使用左连接.

我试图返回大量的结果(有时整个表格),这就是为什么包含不适合我的需要.

The*_*Guy 67

AR提供了#column_names一种返回列名数组的方法

  • column_names()仍可用于ActiveRecord类,它刚刚被移动到另一个模块中. (17认同)
  • 对于将来来这里的人来说,这个方法已被弃用http://apidock.com/rails/ActiveRecord/Base/column_names/class (8认同)
  • `ModelName.columns.map(&:name)`截至2015年6月仍然有效. (4认同)

the*_*tto 13

两种选择

Model.column_names
Run Code Online (Sandbox Code Playgroud)

要么

Model.columns.map(&:name)
Run Code Online (Sandbox Code Playgroud)

名为Rabbit的示例模型,列名为age,on_facebook

Rabbit.column_names
Rabbit.columns.map(&:name)
Run Code Online (Sandbox Code Playgroud)

回报

["id", "name", "age", "on_facebook", "created_at", "updated_at"] 
Run Code Online (Sandbox Code Playgroud)


Fre*_*ung 5

这就是活动记录的检查方法的工作方式:它只列出模型表中的列。属性还是有的

record.blah
Run Code Online (Sandbox Code Playgroud)

将返回 blah 属性,即使它来自另一个表。你也可以使用

record.attributes
Run Code Online (Sandbox Code Playgroud)

获取所有属性的哈希值。

但是,如果您有多个具有相同名称的列(例如,两个表都有一个 id 列),那么活动记录只会将内容混合在一起,而忽略表名。您必须为列名添加别名以使它们唯一。