1

Rails 3.2アプリでは、単純な関連付けがあります

class Element < ActiveRecord::Base
  has_many :categories
end

class Category < ActiveRecord::Base
  belongs_to :element
  validates :name, uniqueness: true
end

そして次のコード

element = Element.find_or_initialize_by_name(elem_name)
element.categories = cat_names.map { |name| Category.where(name: name, element_id: element).first_or_initialize }

cat_namesにすでに使用されている名前が含まれている場合、ActiveRecord :: RecordNotSaved(1つ以上の新しいレコードを保存できなかったため、リソースの置き換えに失敗しました)を発生させます。

私の理解では、first_or_initializeは「new」を呼び出すため、レコードを保存しないでください。これは予想される動作ですか?

ありがとう。

4

2 に答える 2

1

これは、Elementインスタンスが見つからない場合、railsが「element」変数が指すインスタンスを初期化するためです。次に、要素の「category」属性にアクセスしようとすると、次のようにスローされます。

ActiveRecord :: RecordNotSaved(1つ以上の新しいレコードを保存できなかったため、リソースの置き換えに失敗しました。)

Elementレコードがデータベースに永続化されていないため(初期化のみ)。

于 2013-08-02T00:18:04.543 に答える
0

ここで問題だと思いますelement_id: elementelement: elementまたはを使用しelement_id: element_idます。

クエリCategory.where(name: name, element_id: element)は常に空を返します。

そして、既存の名前で新しいカテゴリを初期化します。モデルに検証validates :name, uniqueness: trueがあるため、このエラーが発生します

于 2016-01-27T18:54:01.000 に答える