new と build

自身で改めて

class Cart < ActiveModel
  has_many :line_items
end

class LineItems < ActiveModel
  belongs_to :cart
end

[1]

Cart.new は OK

Cart.build は NG

[2]

c = Cart.new して

c.line_items.new, c.line_items.build は OK

[3] そもそも build は new の alias らしい

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L111

ちょいちょい挙動がちがうのは、new と build で

最終的に呼んでいるクラスが違うから?

でも、それって alias ではない気が

深いところで build だったら foo, new だったら baz のようなことしてるのかね?


[1]

2.0.0-p353 :001 > nCart = Cart.new
 => #<Cart id: nil, created_at: nil, updated_at: nil> 
2.0.0-p353 :002 > bCart = Cart.build
NoMethodError: undefined method `build' for Cart(id: integer, created_at: datetime, updated_at: datetime):Class
    from /home/matsu/.rvm/gems/ruby-2.0.0-p353@two/gems/activerecord-4.0.0/lib/active_record/dynamic_matchers.rb:22:in `method_missing'
    from (irb):2
    from /home/matsu/.rvm/gems/ruby-2.0.0-p353@two/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
    from /home/matsu/.rvm/gems/ruby-2.0.0-p353@two/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
    from /home/matsu/.rvm/gems/ruby-2.0.0-p353@two/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

[2]

2.0.0-p353 :003 > c = Cart.new
 => #<Cart id: nil, created_at: nil, updated_at: nil> 

2.0.0-p353 :004 > c.line_items.new
 => #<LineItem id: nil, product_id: nil, cart_id: nil, created_at: nil, updated_at: nil, quantity: 1> 

2.0.0-p353 :005 > c.line_items.build
 => #<LineItem id: nil, product_id: nil, cart_id: nil, created_at: nil, updated_at: nil, quantity: 1>