【问题标题】:Rails Relation TableRails 关系表
【发布时间】:2013-08-24 21:40:50
【问题描述】:

所以我正在开发一个 Rails 4 应用程序,我有两个模型,一个开发人员和一个应用程序。

基本上我希望开发人员充当创始人并拥有多个应用程序,这些应用程序属于开发人员(创始人)。然后我希望应用程序有很多协作者,并且一个协作者属于许多应用程序。这是我的代码,对吗?我怎么会说将协作者添加到应用程序?

应用程序

has_and_belongs_to_many :collaborators, class_name: 'Developer', foreign_key: :collaborator_id
has_and_belongs_to_many :founders, class_name: 'Developer', foreign_key: :founder_id

开发者

has_and_belongs_to_many :apps, foreign_key: :collaborator_id
has_and_belongs_to_many :apps, foreign_key: :founder_id

关系表

def change
create_table :apps_developers, id: false do |t|
  t.references :founder, references: 'Developer'
  t.references :collaborator, references: 'Developer'

  t.references :app
  t.boolean :collaborator_pending, default: :true
end

add_index :apps_developers, [:founder_id, :app_id], unique: true
add_index :apps_developers, [:collaborator_id, :app_id, :collaborator_pending], unique: true, name: 'index_apps_collaborators'
  end

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-4 activemodel


    【解决方案1】:

    您应该为合作者使用 HABTM,为创始人使用 has_many,而不是相反。

    原因是合作者和应用之间的关系是多对多的,而创始人和应用之间的关系是一对多的。

    /app/models/app.rb

    Class App < ActiveRecord::Base
      belongs_to :founder, :class_name => 'Developer'
      has_and_belongs_to_many :collaborators, :class_name => 'Developer'
    end
    

    /app/models/developer.rb

    Class Developer < ActiveRecord::Base
      has_many :apps, :foreign_key => :founder_id
      has_and_belongs_to_many :apps, :foreign_key => :collaborator_id
    end
    

    至于您的第二个问题,您可以通过以下方式将协作者添加到应用中:

    app.collaborators << developer
    

    其中appApp 类的对象,developerDeveloper 类的对象。

    【讨论】:

    • 如果可能有多个创始人(例如联合创始人),这是否可行?
    • 没有。但是,您没有在问题中提到该要求。如果您需要联合创始人,那么在应用程序和创始人之间使用 HABTM 是对的。有一件事是肯定的,合作者绝对是 HABTM。
    • 您可以做的另一件事是在我的回答中为联合创始人添加第二个关联。应用程序会belongs_to :co_founder, :class_name =&gt; 'Developer',开发人员会has_many :apps, :foreign_key =&gt; :co_founder_id。这样你就可以使用两个不同的外键,你就可以写app.founderapp.co_founder
    • 好的,谢谢,但如果合作者是应用程序的 HABTM,那么这并不意味着合作者实际上拥有该应用程序。协作者应该属于应用的权利,应用应该有很多?
    • 我只是在想,如果开发人员创建了一个应用程序,如果合作者有 HABTM,他们会自动被设置为创始人,因为目前有一个应用程序有许多属于一个应用程序的合作者,创始人默认为创建者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    相关资源
    最近更新 更多