0

我可以使用 create 方法创建具有正确关联的记录,但如果我使用 build 然后保存实例,它不会创建关联。

这行得通

@account = Account.find(params[:id])  
@user = @account.users.create!(:profile_attributes => { name:  name, company: company_name },email: email, password: password, password_confirmation: password)

但这只会创建用户而不是与帐户的关联,这是通过多态成员资格模型

@account = Account.find(params[:id])  
@user = account.users.build(:profile_attributes => { name:  name, company: company_name },email: email, password: password, password_confirmation: password)
@user.save

我想使用 save 以便我可以使用所有的验证和回调。

会员资格.rb

class Membership < ActiveRecord::Base

  belongs_to :target, polymorphic: true
  belongs_to :user
  belongs_to :team

  validates :target, presence: true
  validate  :has_user_or_team

  module HasMembersMixin
    extend ActiveSupport::Concern

    included do
      has_many :memberships,  as: :target
      has_many :users, through: :memberships
    end
    module ClassMethods
      def accessible_by(user)
        conditions = Membership.arel_for_user_or_their_teams(user)
        if direct_conditions = directly_accessible_by(user)
          conditions = conditions.or(direct_conditions)
        end
        includes(:memberships).where conditions
      end
    end
end

模块方法排除

class Account < ActiveRecord::Base
   include Membership::HasMembersMixin
end
4

2 回答 2

0

我认为至少您应该在您的帐户模型中声明这一点:accepts_nested_attributes_for :profile. Accept_nested_attributes_for 的 API

顺便说一句,你为什么在模型中而不是在 lib 文件中声明模块?

于 2012-10-27T11:51:18.067 回答
0

啊,现在我意识到了。因此,问题是,当您创建 AR 实例时,未存储的关联将全部保存。这是默认的创建行为:保存所有内容。但是,如果记录已经存在,则使用它对其关联所做的更改将不会持续存在。假设一个帐户作为用户,这是一个示例:

Account.new(:user => User.new) # this saves the account and the user
a = Account.find(params[:id]); a.user.name = "Boris Karloff" ; a.save # this will not store the user name

所以,这是默认的 AR 行为,你无能为力。您可以在关联上设置 :autosave => true ,但我不推荐它(每次保存帐户时,它也会始终尝试保存所有用户,即使您没有对他们进行任何更改) . 这是,让我们说,一个功能错误:)

于 2012-10-28T22:59:11.893 回答