我正在进行自定义的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>]
答案 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>