在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>
感谢您的帮助!
答案 0 :(得分:2)
并不是它不喜欢它,@workorders
是Workorder
的实例,它没有那种方法。您可以使用数组然后连接子项:
@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
这可以找到:)