为什么first_or_initialize尝试保存记录?

时间:2013-03-25 07:51:20

标签: ruby-on-rails-3.2 rails-activerecord

在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 }

引发 ActiveRecord :: RecordNotSaved(无法替换资源,因为无法保存一个或多个新记录。)当cat_names包含已经采用的名称时。

根据我的理解,first_or_initialize调用'new',因此不应保存任何记录。 这是预期的行为吗?

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我认为这里有问题<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Welcome</title> </head> <body> <h1>Welcome</h1> </body> </html> 。使用element_id: elementelement: element

您的查询element_id: element_id始终为空。

并使用现有名称初始化新类别。由于您的模型有验证Category.where(name: name, element_id: element),您会收到此错误