Ruby on rails 在一个请求中使用两个模型创建多个habtm关系

Ruby on rails 在一个请求中使用两个模型创建多个habtm关系,ruby-on-rails,has-and-belongs-to-many,Ruby On Rails,Has And Belongs To Many,我目前有一个唱片集/艺术家数据库,它使用多个联接表来表示艺术家与唱片集的关系。他们可以被列为作曲家、编曲或表演者。即: class Artist < ActiveRecord::Base ... has_and_belongs_to_many :albumbycomposers, :class_name => "Album", :join_table => "albums_composers" has_and_belongs_to_many :albumbyarrangers,

我目前有一个唱片集/艺术家数据库,它使用多个联接表来表示艺术家与唱片集的关系。他们可以被列为作曲家、编曲或表演者。即:

class Artist < ActiveRecord::Base
...
has_and_belongs_to_many :albumbycomposers, :class_name => "Album", :join_table => "albums_composers"
has_and_belongs_to_many :albumbyarrangers, :class_name => "Album", :join_table => "albums_arrangers"
has_and_belongs_to_many :albumbyperformers, :class_name => "Album", :join_table => "albums_performers"
...
end
由于作曲家参数是第一个参数,rails会正确地解释它们(就好像艺术家不存在一样)。编曲人和表演者的论点也被解释为艺术家不存在。然后rails开始将数据插入我的数据库。首先创建相册并将其插入相册表,然后创建“新艺术家”并将其插入相册编辑器(根据.build方法)

但是,对于arranger和performer参数,无法再使用build方法,因为已经创建了艺术家,因此代码没有正确执行


我尝试使用push方法解决问题(aka我解决了这个问题,首先使用以下代码将每个艺术家分别添加到我的数据库中:

@artists = params["Composer Names"] | params["Arranger Names"] | params["Performer Names"]
@artists.each do |artist|
  if artist.empty? == false
    @exists = Artist.find_by_name(artist)
    if @exists.nil?
      @artist = Artist.new(:name => artist)
      @artist.save
    end
  end
end
我可以使用push方法,使用如下代码将每个艺术家添加到适当的联接表中:

params["Composer Names"].each do |each|
  if each.empty? == false
    @album.composers << Artist.find_by_name(each)
  end
end
params[“编写器名称”]。每个都有|每个|
如果每个都是空的?==false
@唱片制作人
Parameters: {"Name"=>["New Album"],
             "Performer Names"=>["New Artist"], 
             "Composer Names"=>["New Artist"], 
             "Arranger Names"=>["New Artist"], 
             ...
            }
collection<<(object, …)
Adds one or more objects to the collection by creating associations in the join table (collection.push and collection.concat are aliases to this method). 
Note that this operation instantly fires update sql without waiting for the save or update call on the parent object.
@artists = params["Composer Names"] | params["Arranger Names"] | params["Performer Names"]
@artists.each do |artist|
  if artist.empty? == false
    @exists = Artist.find_by_name(artist)
    if @exists.nil?
      @artist = Artist.new(:name => artist)
      @artist.save
    end
  end
end
params["Composer Names"].each do |each|
  if each.empty? == false
    @album.composers << Artist.find_by_name(each)
  end
end