0

目前,用户可以创建一个Track(只需考虑文档)。用户也可以为这些曲目添加书签 我想添加一个共同作者功能,许多用户可以编辑单个曲目。我将如何更改现有的'用户has_many曲目,曲目belongs_to用户'关系,同时维护当前作者?Rails:从“Has_many,Belongs_to”优雅地改变现有的关联?

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 

请问我只需要创建另一个连接表像我做了书签( “:通过=>:track_users”) ,并使用脚本将作者移动到新的连接表中?

回答

1

你可以用这个至少2种方式

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

谢谢您的回复!我有几个问题 1.布尔值的目的是什么?那只是为了确定原作者? 2.对于新的assoc,user.rb模型会是什么样子? 3.我将如何创建曲目?仍然能够使用像“current_user.creations.build?” – kibaekr 2013-02-21 07:18:57

+0

感谢您的编辑:)我仍对“作者布尔”有点困惑。这是为了区分原作者和共同作者吗? (也许这样只有原作者才能删除曲目?) – kibaekr 2013-02-25 04:19:00

+0

此外,找到“author:true”的条件不起作用。我是否需要在track_author.rb模型中指定belongs_to? 以下是我目前在https://gist.github.com/anonymous/5027875的要点。我感谢帮助:) – kibaekr 2013-02-25 05:09:10

相关问题