Ruby on rails 多对多关系中的联接表属性更新

Ruby on rails 多对多关系中的联接表属性更新,ruby-on-rails,activerecord,associations,Ruby On Rails,Activerecord,Associations,我有一个数据模型的多对多关系设置,它处理成员和地址的问题域。基本上,一个“成员”可以有多个“地址”,比如你有一个工作地址和一个家庭地址 除了外键属性外,我还想在联接表上存储其他属性并保存数据。网上有很多关于多对多关系的例子,但我没有找到存储额外数据的细节/例子 这就是我一直面临的问题 模型设置为: 型号 class Member < ActiveRecord::Base has_many :member_addresses has_many :addresses, :throu

我有一个数据模型的多对多关系设置,它处理成员和地址的问题域。基本上,一个“成员”可以有多个“地址”,比如你有一个工作地址和一个家庭地址

除了外键属性外,我还想在联接表上存储其他属性并保存数据。网上有很多关于多对多关系的例子,但我没有找到存储额外数据的细节/例子

这就是我一直面临的问题

模型设置为:

型号

class Member < ActiveRecord::Base
   has_many :member_addresses
   has_many :addresses, :through => :member_addresses
end

class MemberAddress < ActiveRecord::Base
   belongs_to :address   # foreign key for address -> address_id
   belongs_to :member    # foreign key for member ->member_id
end

class Address < ActiveRecord::Base
   has_many :member_addresses
   has_many :members, :through => :member_addresses

   accepts_nested_attributes_for :members, :allow_destroy => true
end
联接表上的“地址类型”字段用于标记与成员关联的地址类型(也称为“主页”或“工作”)

它正在更新这个字段,这正是我遇到的问题。

控制器和视图

成员控制器按如下方式设置模型:

members_controller.rb
def new
   @member = Member.new
   @member.addresses.build    #pre-build the associated address
end
然后,成员页面新建操作的视图为

一切正常-我正在获取我的成员数据和地址数据,以及用于承载我的附加数据的附加字段“addrtype”

现在,如何将数据放入关系或联接表中?在成员控制器上创建操作

def create
   # create a member with the params posted 
   @member = Member.new(params[:member])

   # get data for 'relation data'
   @addr_type = params[:addrtype]



  if @member.save!
      #update the relation now created with the address type
      @member.member_addresses.first.address_type = @addr_type

      # save the relationship (is this necessary?)
      @member.save!

      redirect_to members_path
  end
正如您在创建中所看到的那样,我试图填充联接表上的数据,然后再次强制保存,以便保存与附加属性的关系或关联

这不起作用,而且/或者我做错了


如果您有任何建议,我将不胜感激。

我对Rails的掌握不如我所希望的那么流利,但研究表明,这可能会奏效:

而不是

@member.member\u addresses.first.address\u type=@addr\u type

试一试


@member.member\u addresses.create(:address\u type=>@addr\u type)

尝试将您的模型更改为类似以下内容:

class Member < ActiveRecord::Base
   has_many :member_addresses
   accepts_nested_attributes_for :member_addresses, :allow_destroy => true
end

class MemberAddress < ActiveRecord::Base
   belongs_to :member    
   has_many :addresses
   accepts_nested_attributes_for :addresses, allow_destroy => true
end

class Address < ActiveRecord::Base
   belongs_to :member_addresses
end
这应该允许您通过MemberController.create方法创建MemberAddresses和Addresses

这两条铁路可能也值得一看



正确-如果首先保存@member,则该方法有效,否则将获得ActiveRecord::RecordNotSaved:除非保存父级,否则无法调用create唯一的问题是存在@member.save!,需要保存父项时,额外的“创建”会导致在MemberAddresses联接表中创建两条记录;一个用于第一次保存,它有两个外键,另一个用于“创建”,它有地址类型字段和成员对象的id。它缺少address\u id字段
{"utf8"=>"✓",
     "authenticity_token"=>"E0R038rcdJmBGjjxQ9nQLHGVbzM4ejA0vsEaIvqkwkE=",
     "member"=>{"first_name"=>"James",
     "last_name"=>"SMith",
     "addresses_attributes"=>{"0"=>{"firstline"=>"this is the first line"}}},
     "addrtype"=>"home",
     "commit"=>"Add"}
def create
   # create a member with the params posted 
   @member = Member.new(params[:member])

   # get data for 'relation data'
   @addr_type = params[:addrtype]



  if @member.save!
      #update the relation now created with the address type
      @member.member_addresses.first.address_type = @addr_type

      # save the relationship (is this necessary?)
      @member.save!

      redirect_to members_path
  end
class Member < ActiveRecord::Base
   has_many :member_addresses
   accepts_nested_attributes_for :member_addresses, :allow_destroy => true
end

class MemberAddress < ActiveRecord::Base
   belongs_to :member    
   has_many :addresses
   accepts_nested_attributes_for :addresses, allow_destroy => true
end

class Address < ActiveRecord::Base
   belongs_to :member_addresses
end
@member = Member.new(params[:member])