Rails Controller包括记录和它的孩子

时间:2014-12-05 21:26:28

标签: ruby-on-rails

在Rails应用程序中,我想创建一个包含主记录及其子项的列表视图。

工作单型号:

  belongs_to :parent, :class_name => "Workorder", :foreign_key => "parent_id"
  has_many :children, :class_name => "Workorder", :foreign_key => "parent_id"

这是我的尝试:

  def index17
    @workorder = params[:workorder_id]
    @workorders =  Workorder.find(@workorder)
    @workorders = @workorders + Workorder.find(@workorder).children    
  end

我正在尝试将主人作为第一个记录,然后是所有孩子。

Rails不喜欢“+”:

undefined method `+' for #<Workorder:0x007fefcddf85f8>

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

并不是它不喜欢它,@workordersWorkorder的实例,它没有那种方法。您可以使用数组然后连接子项:

@parent = Workorder.find(params[:workorder_id])
@workorders = []
@workorders << @parent
@workorders.concat @parent.children # it's now [@parent, children1, children2 ...]

答案 1 :(得分:1)

你可以随时做点什么 @workorders.children.unshift(@workorders) 也可以预先添加到数组的前面。

答案 2 :(得分:0)

这样的事情应该有效:

def index17
  @workorder_id = params[:workorder_id]
  @workorder =  Workorder.find(@workorder_id)
  @workorders = [@workorder, @workorder.children].flatten
end

这将创建一个平面列表,首先是父项,然后是其子项。

或者,如果您想尝试一些Rails / SQL魔术,可以按parent_id列进行排序,如下所示:

@workorders = Workorder.where("parent_id = ? OR (parent_id IS NULL AND id = ?)", params[:workorder_id], params[:workorder_id]).order(:parent_id)

因此,父级将位于顶部(因为首先排序空列,然后是每个子级。此版本的优点是它对数据库的查询少一个,并且至少少一行代码;两者总是很好。

答案 3 :(得分:0)

当给find一个值时,它返回一条记录 - 而不是一个集合。因此,@workorders = Workorder.find(@workorder)会为您提供一条记录,该记录没有+方法。要强制find返回集合,请为其指定一个数组:

def index17
  @workorder = params[:workorder_id]
  @workorders =  Workorder.find([@workorder])
  @workorders = @workorders + @workorders.first.children    
end

这可以找到:)