在Rails 4中,如何编写将检索对象而不是活动记录关系的代码?

时间:2014-08-18 14:48:03

标签: ruby-on-rails ruby rails-activerecord

我有这段代码:

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")

http://apidock.com/rails/ActiveRecord/Base/find/class

2 个答案:

答案 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
很高兴。