0

モデルにモデルが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 を再帰的に保存するより良い方法はありますか?

4

1 に答える 1