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 (无法替换资源,因为无法保存一个或多个新记录。) 。

据我了解 first_or_initialize 调用“新”,因此不应保存任何记录。这是预期的行为吗?

谢谢。

4

2 回答 2

1

这是因为当找不到 Element 实例时,rails 会初始化它的一个实例,您的“元素”变量指向该实例。然后,当您尝试访问元素的“类别”属性时,它会抛出:

ActiveRecord::RecordNotSaved(替换资源失败,因为一条或多条新记录无法保存。)

因为元素记录没有持久化到数据库中(仅初始化)。

于 2013-08-02T00:18:04.543 回答
0

我认为这里有问题element_id: element。使用element: elementelement_id: element_id

您的查询Category.where(name: name, element_id: element)始终返回空。

并且您使用现有名称初始化新类别。由于您的模型已验证validates :name, uniqueness: true,您会收到此错误

于 2016-01-27T18:54:01.000 回答