如何通过接受嵌套属性的多对多关系创建新记录?

时间:2015-07-31 16:28:23

标签: ruby-on-rails ruby ruby-on-rails-4 associations seeding

OrganizationUser通过Relationship进行多对多关联。最初我实现了一个1对多的关联,它有效,但现在我需要通过关联成为多对多关系。所以我创建了Relationship模型并更改了模型文件中的关联。

Organization接受User的嵌套属性,就像在我的应用中一样,我有两个联合注册表单。另外,我在种子文件中使用它:

Organization.create!(name: "name", ...).users.create(email: "email@email.com", ...)

当它是1对多的关联时,这是有效的,但现在它是一个多对多的关联,它会在播种时产生错误:

Validation failed: Member can't be blank, Moderator can't be blank 

这是指Relationship模型的变量,UserOrganization与之相关联。

导致此错误的原因;为什么这些值是空白的?对于多对多关联,Organization.create行可能不正确吗? membermoderator具有默认值(请参阅迁移文件)。我希望它能够使用默认值创建organizationuserrelationship。我还应该如何创建新的组织和用户?

组织模式:

has_many :relationships, dependent: :destroy
has_many :users, through: :relationships

accepts_nested_attributes_for :relationships, :reject_if => :all_blank, :allow_destroy => true
validates_associated :users

关系模型:

belongs_to :organization
belongs_to :user
accepts_nested_attributes_for :user

validates_presence_of :organization
validates_presence_of :user
validates :member, presence: true
validates :moderator, presence: true

用户模型:

has_many :relationships, dependent: :destroy 
has_many :organizations, through: :relationships, inverse_of: :users

关系迁移:

class CreateRelationships < ActiveRecord::Migration
  def change
    create_table :relationships do |t|
      t.belongs_to :user, index: true
      t.belongs_to :organization, index: true

      t.boolean :member, null: false,  default: false
      t.boolean :moderator, null: false,  default: false
      t.timestamps null: false
    end
    add_index :relationships, [:user_id, :organization_id], unique: true
  end
end

1 个答案:

答案 0 :(得分:1)

我认为你的问题可能是你没有指定一个&#34;外键&#34;用户模型中的has_many关系。试试:

has_many :relationships, foreign_key: "organization_id", dependent: :destroy

这可以唯一地标识与您的用户模型的每个关系的组织。