【问题标题】:Rails: changing existing association from "Has_many, Belongs_to" gracefully?Rails:优雅地从“Has_many,Belongs_to”更改现有关联?
【发布时间】:2013-02-06 09:19:05
【问题描述】:

目前,用户可以创建一个 Track(想想文档)。用户还可以为这些曲目添加书签。 我想添加一个共同作者功能,许多用户可以在其中编辑单个曲目。如何在保持当前作者的同时更改现有的 'User has_many track, Tracks 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 

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

【问题讨论】:

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


    【解决方案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 } }
    

    【讨论】:

    • 感谢您的回复!我有几个问题 1. 布尔值的目的是什么?只是为了确定原作者吗? 2. 新 assoc 的 user.rb 模型是什么样的? 3. 我将如何创建曲目?仍然可以使用“current_user.creations.build”之类的东西?
    • 感谢您的编辑 :) 我对“作者布尔值”仍然有些困惑。这是为了区分原始作者和共同作者吗? (也许只有原作者才能删除曲目?)
    • 另外,寻找“作者:真”的条件也不起作用。我是否需要在 track_author.rb 模型中指定 belongs_to ?这是我目前在gist.github.com/anonymous/5027875 的要点。感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多