Ruby on Rails ActiveRecord find_by-sql字段名称

时间:2009-12-29 00:46:56

标签: ruby-on-rails activerecord

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

e.g。

@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>] 

4 个答案:

答案 0 :(得分:1)

@fm_reports = FmReport.find_by_sql(crosstab_query)
field_values = @fm_reports.attributes
field_values.each {|key, value| puts key}

上面的行将返回字段名称及其值的哈希映射。如果需要,可以迭代它们。

答案 1 :(得分:0)

也许您正在寻找#attributes

此外,find_by_sql返回Array,这就是没有方法称为属性的原因。如何根据您的查找结果first.attributes进行操作?

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

为什么不直接使用ActiveRecord的内置内容?

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

答案 2 :(得分:0)

答案 3 :(得分:0)

我知道这已经过时了,但它可以帮助任何有同样问题的人 我通常这样做:

<div class="main">
<?php for($i=1;$i<=5;$i++) {
  $html = "<div class='sections'><label class='labels'>label - $i </label></ br>";
  $html .= "<input type='text' class='textbox'></br>";
  $html .= "<button class='edit'>edit</button></br></div>";
  echo $html;
}
 ?>
</div>
<script type="text/javascript">
 (function($, window, document, undefined){
  var
    constants = {
      main : '.main',
      sections : '.sections',
      textbox : '.textbox',
      edit : '.edit',
      labels : '.labels'
    },
    properties = {
      mainDiv : null,
      sectionDiv : null,
      edit : null,
      textbox : null,
      labels : null,
    },
    methods = {

      init: function() {
          properties.mainDiv = $(constants.main);
          properties.sectionDiv = properties.mainDiv.find($(constants.sections));
          properties.edit = properties.sectionDiv.find($(constants.edit));
          properties.textbox = properties.sectionDiv.find($(constants.textbox));
          properties.labels = properties.sectionDiv.find($(constants.labels));
          properties.textbox.css({
                   display: 'none'
                 });
          properties.edit.click(methods.run);

    },
    run : function (event){
      var $this = $(this);
      $this.parent().find(properties.labels).toggle();
      $this.parent().find(properties.textbox).toggle();
    }
  };
 $(document).ready(methods.init);
 })(jQuery, window, document);
</script>