【发布时间】:2014-07-26 08:26:00
【问题描述】:
我正在尝试为每个用户可能有许多电子邮件(至少一个)的系统建模。
遵循良好的规范化规则,我创建了两个迁移(为简洁起见删除了一些字段):
create_table :users do |t|
end
create_table :user_emails do |t|
t.integer :user_id, null: false
t.string :email, null: false
end
add_index :user_emails, :email, :unique => true
add_foreign_key :user_emails, :users, dependent: :delete
以及以下导轨型号:
class User < ActiveRecord::Base
has_many :emails, class_name: 'UserEmail', dependent: :destroy
def self.find_by_email(email)
UserEmail.find_by(email: email).try(:user)
end
validate do
if emails.count < 1
errors.add(:emails, "is empty")
end
end
end
class UserEmail < ActiveRecord::Base
belongs_to :user
validates_presence_of :user_id, :email
validates_uniqueness_of :email
end
现在我无法创建任何这些。无法创建用户,因为它至少需要一个 UserEmail。同时,不能预先创建 UserEmail,因为它需要一个 user_id。
我相信我已经尝试过任何我能想到的@user.emails.build 和@user.emails << e 的组合。
如何在不放弃数据一致性的情况下解决这个非常简单的问题(一个被保存而另一个不被保存)?
P.s.:我认为放松验证和使用事务可能会始终如一地解决问题。但是我从未在 Rails 中使用过事务,因此非常感谢任何帮助。
谢谢
【问题讨论】:
-
你试过@user_email.build_user
-
在 user_id 为空时仍然报告验证错误:(
标签: ruby-on-rails validation rails-activerecord