0

現在、ユーザーはトラックを作成できます (ドキュメントについて考えてみてください)。ユーザーはこれらのトラックをブックマークすることもできます。多くのユーザーが 1 つのトラックを編集できる共同作成者機能を追加したいと考えています。現在の作成者を維持しながら、既存の「ユーザーには多くのトラックがあり、トラックはユーザーに属しています」という関係を変更するにはどうすればよいですか?

ユーザー.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 

Track.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

あなたはこれで少なくとも2つの方法で行くことができます

  1. 作成者の関連付けを維持し、結合テーブルを作成するだけです。この結合テーブルに属性を追加する予定がない場合は、おそらくこれでhabtmを使用できます。
  2. author_idを軌道に乗せて、作成者のブール値を結合テーブルに追加できます。

私は2番目の解決策を好むので、それをやってみましょう。結合テーブルを作成し、作成者を結合テーブルに移動する移行を作成します

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 に答える