【问题标题】:Ruby on Rails ActiveRecord find_by-sql field namesRuby on Rails ActiveRecord find_by-sql 字段名称
【发布时间】:2009-12-29 00:46:56
【问题描述】:

我正在执行由用户输入动态创建的自定义 find_by_sql 查询。查找 find_by_sql 返回的字段名称的最佳方法是什么
我尝试过使用列、列名和键方法,但都没有。 ActiveRecord 结果是散列还是数组?

例如

@fm_reports = FmReport.find_by_sql(crosstab_query)
field_names = @fm_reports.keys (or .columns or .column_names)

干杯,基思

更新 ::

似乎除非您在 find_by_sql 中执行“select * from ....”,否则它不会返回属性名称

>> FmReport.find_by_sql("select object_class, alarm_mr from fm_reports limit 1") 
=> [#<FmReport >] 
>> FmReport.find_by_sql("select * from fm_reports limit 1") 
=> [#<FmReport id: 7, ALARM_DN: "PLMN-PLMN/BSC-31569/TCSM-72", ALARM_OBJECT: "MELB_BSC1", ALARM_MR: "VIC_METRO", PARENT_DN: "PLMN-PLMN/BSC-31569", PARENT_CLASS: "BSC", OBJECT_CLASS: "TCSM", ALARM_NUMBER: "2955", ALARM_TIME: "21/12/2009 11:02:19", CANCEL_TIME: "21/12/2009 11:03:27", SEVERITY: "2", created_at: nil, updated_at: nil>] 

【问题讨论】:

  • 好吧,现在我真的很困惑,如果我使用在表中创建的字段名称(即在本例中为大写 - OBJECT_CLASS),它将返回属性名称。但是我的查询无法做到这一点,所以我想我已经吃饱了。
  • 在您的示例中,您不需要使用 find_by_sql 。请参阅我的更新答案。您能否更具体地了解您需要的查询?

标签: ruby-on-rails activerecord


【解决方案1】:
@fm_reports = FmReport.find_by_sql(crosstab_query)
field_values = @fm_reports.attributes
field_values.each {|key, value| puts key}

以上行将返回字段名称及其值的哈希图。如果需要,可以对其进行迭代。

【讨论】:

  • 感谢 Priyank,我试过了,但它仍然显示 #<0x341631c>
【解决方案2】:

【讨论】:

  • 谢谢 Dan,我确实尝试了 attribute_names 但它一直说未知方法
  • 你运行的是什么版本的rails?
【解决方案3】:

也许您正在寻找#attributes

另外,find_by_sql 返回一个Array,这就是为什么没有称为属性的方法的原因。对您的查找结果执行first.attributes 怎么样?

另一个问题是你为什么要使用find_by_sql

为什么不直接使用 ActiveRecord 的内置东西呢?

SomeModel.find( :all, :limit => 1 ).first.attributes

【讨论】:

  • 谢谢,我已经更新了原始问题,因为 find_by_sql 似乎仅在您执行 select * from ... 时才返回属性
  • 嗨,限制 1 只是一个示例,保存 800k + 行,基本上我的控制器根据用户输入动态创建交叉表/数据透视查询,然后显示输出。所以查询中有 SUM 和 COUNT 函数。我已经为我的问题找到了解决方法(这些方法都没有真正解决原来的问题),所以我会继续处理它,如果我得到一个适合我的情况的答案,我会发布一个答案。感谢您的所有帮助。
  • PS 这是生成的查询类型 - 选择 ALARM_MR 作为 row_name,SUM(IF(PARENT_CLASS = "BCF", 1 , 0)) AS BCF,SUM(IF(PARENT_CLASS = "BSC", 1 , 0)) AS BSC,SUM(IF(PARENT_CLASS = "BTS", 1 , 0)) AS BTS,SUM(IF(PARENT_CLASS = "FRBC", 1 , 0)) AS FRBC,SUM(IF(PARENT_CLASS = "ROOT", 1 , 0)) AS ROOT,SUM(IF(PARENT_CLASS = "WBTS", 1 , 0)) AS WBTS,count(1) as @ 987654333@ 来自 ALARM_MR 的 fm_reports 组
【解决方案4】:

我知道这是旧的,但它可能会帮助任何有同样问题的人。
我通常这样做:

@fm_reports = FmReport.find_by_sql(crosstab_query)
field_names = @fm_reports.first.attributes.keys

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多