【发布时间】:2016-02-24 01:43:19
【问题描述】:
我有 3 个模型
class Patient < ActiveRecord::Base
has_one :address, as: :person
has_many :doctors
accepts_nested_attributes_for :address, :reject_if => :all_blank, :allow_destroy => true
validates_associated :address
accepts_nested_attributes_for :doctors, :reject_if => :all_blank, :allow_destroy => true
validates_associated :doctors
end
class Doctor < ActiveRecord::Base
after_initialize :init, unless: :persisted?
has_one :address, as: :person
belongs_to :patient
accepts_nested_attributes_for :address, :reject_if => :all_blank, :allow_destroy => true
validates_associated :address
def init
self.address ||= build_address
end
end
class Address < ActiveRecord::Base
belongs_to :person, polymorphic: true
end
我正在使用 simple_form 和 cacoon 来处理我的 UI。 我不得不在模型级别询问专家初始化地址,否则专家的地址不会为 cacoon 初始化。
在我的控制器中,我使用
启动我的医生和地址@patient.doctor.build
@patient.address ||= Address.new
但是,如果专家地址的每个输入都是空白的,我会收到一条错误消息。
SQLite3::ConstraintException: NOT NULL 约束失败:addresses.line_1: INSERT INTO "addresses" ("person_type", "person_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)
这是否意味着它会在保存过程中自动生成地址,即使
accepts_nested_attributes_for :address, :reject_if => :all_blank, :allow_destroy => true
设置好了吗?
有没有办法解决这个问题?还是有更好的方法来实现我想要的?
【问题讨论】:
-
你知道是哪个地址给你的错误吗? (例如患者或医生)。因为我怀疑
Doctor中的init可能对此负责。 -
是医生。有关如何解决此问题的任何建议?
-
不要否决
init方法 ;) afaik 首选方法是定义特殊方法after_init但即使这样也非常危险,因为您的代码可能会否决现有关联(正如您现在注意到的那样也)。我会在控制器中为医生初始化一个空地址,就像你为病人做的一样。 -
问题是使用 cacoon 初始化不经过控制器...这意味着动态初始化的医生没有地址...
标签: ruby ruby-on-rails-4 associations simple-form cocoon-gem