0

目前,用户可以创建一个 Track(想想文档)。用户还可以为这些曲目添加书签。我想添加一个共同作者功能,许多用户可以在其中编辑单个曲目。如何在保持当前作者的同时更改现有的“用户 has_many 曲目,曲目属于用户”关系?

用户.rb:

#authors(creates) track
has_many :creations, :class_name => "Track", :foreign_key => "author_id"

#bookmarks track
has_many :track_users
has_many :tracks, :through => :track_users 

轨道.rb:

belongs_to :author, :class_name => "User", :foreign_key => "author_id"

#bookmarked users
has_many :track_users
has_many :users, :through => :track_users 

我是否只需要像使用书签(“:through => :track_users”)一样创建另一个连接表,并使用脚本将作者移动到新的连接表?

4

1 回答 1

1

你至少可以用两种方式

  1. 保持作者关联,只需创建一个连接表。如果您不打算在此连接表上添加更多属性,则可以将 habtm 与此一起使用
  2. 您可以将 author_id 放在轨道上并将作者布尔值添加到连接表中。

我更喜欢第二种解决方案,所以让我们这样做。创建一个创建连接表并将作者移动到连接表的迁移

def up
  create_table :track_authors do |t|
    t.integer :user_id
    t.integer :track_id
    t.boolean :author, default: false
  end

  add_index :track_authors, :user_id
  add_index :track_authors, :track_id

  # let's call the join table track_authors
  Track.find_each do |track|
    TrackAuthor.create(user_id: track.author_id, track_id: track.id, author: true)
  end
end

然后在你的模型中,你可以这样做

# track.rb
has_many :track_authors
has_many :authors, through: :track_authors
has_one :author, through: :track_authors, conditions: { track_authors: { author: true } }

# track_author.rb
belongs_to :author, class_name: 'User'
belongs_to :track

# user.rb
has_many :track_authors
has_many :tracks, through: :track_authors
has_many :authored_trackes, through: :track_authors, conditions: { track_authors: { author: true } }
于 2013-02-21T07:07:35.673 回答