我有这段代码:
Sectionheader.where(:doc_id => @doc_id)
返回:
#<ActiveRecord::Relation
[#<Sectionheader id: 1, section_id: nil, content: "a15+,f15+,a15+,f15+,a15+,f15+,a15+,f15+", created_at: "2014-08-13 18:18:39", updated_at: "2014-08-13 18:18:39", documentname: nil, doc_id: 1, row_number: 3, mergedsectionheader_id: nil>,
#<Sectionheader id: 2, section_id: nil, content: "A50+,F50+,A50+,F50+,A50+,F50+,A50+,F50+", created_at: "2014-08-13 18:18:39", updated_at: "2014-08-13 18:18:39", documentname: nil, doc_id: 1, row_number: 12, mergedsectionheader_id: nil>,
此结果集是一个activerecord关系对象的数组。我怎样才能获得Sectionheader类型的对象?
曾经有过这种方法但似乎在rails 4中已被弃用 例如,这将返回一个人物对象数组。
Person.find(1, :conditions => "administrator = 1", :order => "created_on DESC")
答案 0 :(得分:1)
正如Sergio Tulentsev在上面评论的那样。
如果要从关系中获取一系列Sectionheader记录,可以调用#to_a
Sectionheader.where(:doc_id => @doc_id).to_a
如果您想加载关系,可以调用#load
Sectionheader.where(:doc_id => @doc_id).load
如果您想完全跳过AR模型实例化,可以调用#pluck(col1,col2,...)。这将返回表示记录的多维数组。
Sectionheader.where(:doc_id => @doc_id).pluck(:id, :section_id, :content)
答案 1 :(得分:0)
您实际拥有的是表示结果集的关系对象。如果要对其执行操作,该操作需要来自数据库的实际数据,则它将解析为数组样式对象。您可以在响应中看到此操作,控制台向您显示实际数据。
#<ActiveRecord::Relation
[#<Sectionheader id: 1, section_id: nil, content: "a15+,f15+,a15+,f15+,a15+,f15+,a15+,f15+", created_at: "2014-08-13 18:18:39", updated_at: "2014-08-13 18:18:39", documentname: nil, doc_id: 1, row_number: 3, mergedsectionheader_id: nil>,
#<Sectionheader id: 2, section_id: nil, content: "A50+,F50+,A50+,F50+,A50+,F50+,A50+,F50+", created_at: "2014-08-13 18:18:39", updated_at: "2014-08-13 18:18:39", documentname: nil, doc_id: 1, row_number: 12, mergedsectionheader_id: nil>, ...
这实际上意味着#<ActiveRecord::Relation
是容器。 [
表示已打开数组类型对象。 #<Sectionheader id: 1, ...
是数组的第一个元素,依此类推。
如果您尚未在那里结束语句(将其转储到控制台并强制ActiveRecord进行查询),您将拥有一个表示查询SQL的关系对象。如果您愿意,可以添加到此(使用选择,条件或排序等),而不会产生进一步数据库查找的惩罚。
对于大多数情况,您可以(也可能应该)将其视为数组。如果正常的数组方法不起作用,可以对关系执行.to_a
,或者对单个对象执行.attributes
以获取查询返回的值的哈希值。
例如,你可以这样做:
Sectionheader.where(:doc_id => @doc_id).each do |sectionheader|
puts sectionheader.doc_id
end
很高兴。