モデルにモデルがLine Items
埋め込まれていLine
ます。明細作成ビューでは、明細項目の複数のネストされたレベルを定義する機能を提供しました。
のランダムなスナップを次に示しますparam[:line]
。
=> {"title"=>"Hello", "type"=>"World", "line_items"=>{"1"=>{"name"=>"A",
"position"=>"1", "children"=>{"1"=>{"name"=>"A1", "position"=>"1",
"children"=>{"1"=>{"name"=> "A11", "position"=>"1"}, "2"=>{"name"=>"A12",
"position"=>"2"}}}, "2"=>{"name"=>"A2", "position"=>"2"}}}, "3"=>
{"name"=>"B", "position"=>"3"}}}
Line#create には、次のものがあります。
def create
@line = Line.new(params[:line])
if @line.save
save_lines(params[:line][:line_items])
flash[:success] = "Line was successfully created."
redirect_to line_path
else
render :action => "new"
end
end
Line#save_lines には、次のものがあります。
# Save children up to fairly infinite nested levels.. as much as it takes!
def save_lines(parent)
unless parent.blank?
parent.each do |i, values|
new_root = @line.line_items.create(values)
unless new_root[:children].blank?
new_root[:children].each do |child|
save_lines(new_root.children.create(child))
end
end
end
end
end
LineItem モデルは次のようになります。
class LineItem
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Ancestry
has_ancestry
# Fields
field :name, type: String,
field :type, type: String
field :position, type: Integer
field :parent_id, type: Moped::BSON::ObjectId
attr_accessible :name, :type, :url, :position, :parent_id
# Associations
embedded_in :line, :inverse_of => :line_items
end
ラインモデルでは、私は持っています:
# Associations
embeds_many :line_items, cascade_callbacks: true
期待どおりに動作します。しかし、祖先を使用して line_items を再帰的に保存するより良い方法はありますか?