0

accept_nested_attributes_for でこれらのモデルを使用して、「保存」と「作成」が異なる理由を理解するのに苦労しています。これは私のモデルです:

class Book < ActiveRecord::Base
  has_many :pages
  has_many :picture_pages, :through => :pages, :source => :pagetype, :source_type => 'PicturePage'
  accepts_nested_attributes_for :picture_pages
end

class PicturePage < ActiveRecord::Base
  has_one :page, :as =>:pagetype
  has_one :book, :through => :pages
  accepts_nested_attributes_for :page
end

class Page < ActiveRecord::Base
  belongs_to :book
  belongs_to :pagetype, :polymorphic => true, :dependent => :destroy
end

まずはsaveメソッドを使って……。

b = Book.first
params = { "page_attributes"=> { "number"=>"1" }}
p = b.picture_pages.new(params)
p.save

...期待どおりに機能します。Rails は自動的に新しい PicturePage を作成し、対応するページ結合モデルに "number" 属性が割り当てられます。完全。しかし、私がこれを行うと:

b = Book.first
params = { "page_attributes"=> { "number"=>"1" }}
p = b.picture_pages.create(params)

... Rails は 2 つの結合モデルを作成します。1 つは完全に空で、もう 1 つは number 属性を持ちます。どうしてこれなの?

Book モデルで accept_nested_attributes_for を使用する場合、これは大きな問題です。Book モデルは、作成中の PicturePage モデルで自動的に「作成」を呼び出すためです。

任意のヒント?これはRailsのバグですか?

4

2 に答える 2

0

create:オブジェクト(または複数のオブジェクト)を作成し、データベースに保存します。

save:モデルが新しい場合はデータベースにレコードが作成され、そうでない場合は既存のレコードが更新されます。

基本的に、createを使用して特定のレコードを更新することはできませんが、saveを使用すると更新できます。ただし、新しいレコードの場合は両方を使用できます。これを1行のコードで実行するか2行で実行するかによって異なります。

于 2011-11-23T12:26:46.010 に答える
0

ここで多くのことが起こっています:

  • has_many :through の
  • two は、双方向のネストされた属性を受け入れます
  • 多形関連

私のヒント (あなたが尋ねたように) は、アジャイルな方法でこれらのことに 1 つずつ取り組むことです。次の作業を行う前に、作成、編集、および表示のために各ピースを動作させます。これは、あなたが前進するのに大いに役立ちます。

  • 最初に has_many スルーの動作を取得します。
  • 次に、ネストされた属性を機能させます。そして、1 つの nested_attributes から始めます。
  • 最後に、ポリモーフィック アソシエーションに取り組みます。しかし、多くの人はポリモーフィック アソシエーションを避けたり放棄したりすることに注意してください。特にこのように組み合わせる場合は、レールの初心者にはお勧めしません。

最後の注意点は、最初にレールを読んだり勉強したりしない限り、このようなことはあまり意味がありません。それに関する多くの Web リソースがそこにあります。

私は次のようなものを始めようとします:

class Book < ActiveRecord::Base
  has_many :page_pictures
  has_many :pictures, :through => :page_pictures
end

class PagePicture < ActiveRecord::Base
  belongs_to :book
  belongs_to :picture
end

class Picture < ActiveRecord::Base
  has_many :page_pictures
  has_many :books, :through => :page_pictures
end

これで、写真を複数のページや本に入れることができますが、これはおそらく必要ないでしょうが、これはより「標準的な」has_many であり、機能するので、これから始めます。

于 2011-11-23T12:43:14.460 に答える