4

レールでは、other_ids=[...]メソッドを使用して関連付けに接続を割り当てていhas_many :throughます。データベースにコミットしたくない場合を除いて、正常に動作other_ids=[...]します(このメソッドで割り当てると自動的に保存されます)。

Model.new を使用するだけでこれらの接続を割り当てる方法はありますか? これが役立つ例として、has_many関係のチェックボックスを含むフォームを送信する場合があります。フォームが保存されない場合 (検証が失敗した場合)、選択したチェックボックスがリセットされます。

モデル:

class Job < ActiveRecord::Base
  has_many :categories
  attr_accessible :category_ids
end

意見:

select :category_ids, Category.all.collect {|x| [x.name, x.id]}, {}, {:multiple => true}
4

1 に答える 1

3

それは変です。つまり、それが保存される理由は理解できます。なぜなら、それは他のレコードの関係であり、あなたが扱っているものではありませんが、AR でその機能を実装するのは簡単なはずだと思います.

とにかく、これを回避するには、次のようなことを行うことができます。仮想属性の使用

class Bar < ActiveRecord::Base
  after_save :save_foos
  has_many :foos

  attr_accessor :temp_foo_ids # Bad name for it but whatever...
  attr_accessible :temp_foo_ids

  def save_foos
    foo_ids = temp_foo_ids  # it should save the record like this again right?
  end
end

ビューでは、仮想属性も使用します

select :temp_foo_ids, Foo.all.collect {|x| [x.name, x.id]}, {}, {:multiple => true}

私はこれについて何もテストしていませんが、うまくいくと確信しています;)

于 2012-11-17T00:36:25.920 に答える