如何在连接模块属性上进行状态验证并将新对象和相关关联保存在一起?
CODE
class User < ActiveRecord::Base
attr_accessible :email, :name, :password, :password_confirmation
has_many :user_roles
has_many :roles, through: :user_roles
...
end
class Role < ActiveRecord::Base
before_save { |role| role.name = role.name.downcase }
attr_accessible :name
has_many :user_roles
has_many :users, through: :user_roles
validates :name, uniqueness: {case_sensitive: false}
end
class UserRole < ActiveRecord::Base
belongs_to :user
belongs_to :role
validates :user, presence: true #verified this is the reason
validates :role, presence: true #same with this validation
end
问题
如果我尝试创建一个新用户,为user.roles分配一个角色,并保存用户,除非我先保存用户,然后关联该角色并再次使用该角色保存用户,否则它将不会。
role = Role.find_by_name(:attendee)
@user = User.new(...set attr...)
if (role)
@user.roles << role unless @user.roles.include?(role)
end
@user.save => #false
但如果我先保存用户然后设置角色,它会让我用角色保存用户
@user = User.new(...set attr...)
@user.save => #true
@user.roles << role
@user.save => #true
我验证了我是否没有验证:user AND validates:role,presence:true它将同时保存带有Role关联的User对象。
如何设置带有加载角色的User.roles并在第一次设置角色时保存用户对象?