Rails:优雅地改变“Has_many,Belongs_to”的现有关联?

时间:2013-02-21 06:08:48

标签: ruby-on-rails ruby-on-rails-3 database-design has-many-through rails-activerecord

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

User.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”),并使用脚本将作者移动到新的连接表中?

1 个答案:

答案 0 :(得分:1)

你可以至少使用这两种方式

  1. 保留作者关联,只创建一个连接表。如果你不打算在这个连接表上添加更多属性,你可以使用habtm
  2. 您可以将author_id放在轨道上,并将作者布尔值添加到连接表中。
  3. 我更喜欢第二种解决方案,所以让我们这样做。创建一个创建连接表的迁移并将作者移动到连接表

    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 } }