【问题标题】:Rails has_and_belongs_to_many with ManyRails has_and_belongs_to_many with Many
【发布时间】:2013-08-26 01:26:48
【问题描述】:

我正在开发一个具有复杂关联的 Rails 4 应用程序,但我不知道如何将一个模型加入到父模型中。

基本上我的应用逻辑如下

User
  - belongs_to :account, polymorphic: true

Developer
  - has_one :user, as: :account
  - has_and_belongs_to_many :organizations

Organization
  - has_one :user, as: :account
  - has_and_belongs_to_many :developers
  • 我决定通过 STI 走这条路线,因为这让我可以让我的应用迁移文件更整洁、更有条理

所以可以有一个 Developer 本身,也可以有一个 Organization 包含许多 Developers,所以我添加了 has_and_belongs_to_many :organizationshas_and_belongs_to_many :developers 来创建这种关系。因此,如果我查找 User.find().account.developersUser.find().account.organizations,我的应用程序中的所有内容都可以正常工作,我会得到相关记录。


现在我们到了我遇到问题的部分。在我的 Rails 应用程序中,我有一个名为 App 的模型。 Developer 可以自己创建多个Apps,或者Developer 可以创建和Organization 并在该Organization 内创建多个Apps,属于该Organization 的所有Developers 都可以访问也。我不知道如何实现这样的关系。有什么建议吗?


Developer
  has_one :user, as: :account
  has_many :apps, as: :appable
  has_and_belongs_to_many :founding_organizations, class_name: 'Organization', foreign_key: :founder_id
  has_and_belongs_to_many :collaborating_organizations, class_name: 'Organization', foreign_key: :collaborator_id

  has_and_belongs_to_many :organizations   (Should this stay?)

Organization
       has_one :user, as: :account
  has_many :apps, as: :appable
  has_and_belongs_to_many :founders, class_name: 'Developer', association_foreign_key: :founder_id
  has_and_belongs_to_many :collaborators, class_name: 'Developer', association_foreign_key: :collaborator_id

  has_and_belongs_to_many :developers   (Should this stay?)

App
  belongs_to :appable, polymorphic: true

【问题讨论】:

  • 一个开发者可以属于多个组织吗?
  • @Bigxiang 是的,他们可以

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


【解决方案1】:

/app/models/app.rb

App < ActiveRecord::Base
  belongs_to :appable, :polymorphic => true
end

/app/models/organization.rb

Organization < ActiveRecord::Base
  has_and_belongs_to_many :founders, :class_name => 'Developer', :association_foreign_key => :founder_id, :join_table => 'founders_organizations'
  has_and_belongs_to_many :collaborators, :class_name => 'Developer', :association_foreign_key => :collaborator_id, :join_table => 'collaborators_organizations'
  has_many :apps, :as => :appable
  # Other relationships
 end

/app/models/developer.rb

Developer < ActiveRecord::Base
  has_and_belongs_to_many :founded_organizations, :class_name => 'Organization', :foreign_key => :founder_id, :join_table => 'founders_organizations'
  has_and_belongs_to_many :collaborated_organizations, :class_name => 'Organization', :foreign_key => :collaborator_id, :join_table => 'collaborators_organizations'
  has_many :apps, :as => :appable
  # Other relationships
 end

【讨论】:

  • 我在想,为了让它更干净,我可以让一个组织有很多创始人和很多合作者,这种设置可以实现吗?
  • 没有。这只有在一个组织只有一个创始人时才有效。你昨晚不是也问过我同样的问题吗? :)
  • 是的,我为自己的冗余感到抱歉,只是我每天都想出一个听起来更好的新逻辑,然后我在实现它时遇到了麻烦。感谢您的帮助,我们是否可以修改上述内容以使组织拥有许多创始人和许多合作者,或者根本不起作用?
  • 谢谢,我用底部的新模型更新了我的问题,它们看起来还好吗?
  • 回答您的问题,必须删除这些行。现在,开发人员只能以创始人或合作者的身份与组织建立联系。
【解决方案2】:

如果您想要一个 HABTM 关联。你需要一个连接表。在 Rails 4 中,您可以添加一个包含以下内容的迁移文件:

create_join_table :developers, :organizations

然后只需使用:

Developer.find().organizations

Organization.find().developers

如果您使用User.find().account。你必须先得到账号的类,然后决定使用developersorganizations

【讨论】:

  • 谢谢,这让事情变得更清楚了,但就将应用程序添加到帐户或组织而言,这行得通吗?
  • 我认为它应该可以在任何地方添加应用程序。您最好将应用程序添加到用户模型中,将其与开发人员或组织解耦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 2018-02-26
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多