如何修复我的模型关联

时间:2015-04-11 20:38:18

标签: ruby-on-rails

我很难理解模型关联,以及如何正确设置它们。我希望有人在这里知道如何,我可以解释我想要完成的任务。

我有一个如下所示的用户模型:

has_many :companies
has_many :contacts
belongs_to :company

用户可以创建公司,并且属于公司。它还可以从电子邮件提供商(例如Google)导入联系人。因此它可以有很多联系人。

然后我们有公司模型:

belongs_to :admin, class_name: 'User', foreign_key: 'user_id'
has_many :users
has_many :categories
has_many :contacts

公司属于管理员,管理员是创建它的用户。但是,它也可以有几个属于公司的用户(他们受到管理员的邀请)。它还有管理员可以创建的类别 - 属于公司。它还可以有联系人,这些联系人将放置类别的内容(类别是联系人的组)。

然后我们有了类别。它们由公司的管理员(用户)创建。

belongs_to :company
has_many :contacts

类别存储所有联系人。

最后是联系人:

belongs_to :user
belongs_to :company

联系人属于用户(导入他们的用户)但是他们也是公司资产的一部分(与用户所做的所有操作一样),他们不一定需要成为公司的一部分。类别,但他们可以 - 也可以是几个类别的一部分。

我确定存在一些缺陷,我现在想修复我的关联,所以我最终不会在错误的结构上构建大量代码。

希望有人可以帮助我,如何清理这个相对较大的应用程序,为新手

2 个答案:

答案 0 :(得分:0)

我会改变一些事情:

  1. company模型中,将has_many :contacts更改为has_many :contacts, through: :categories。似乎categories仅用于将联系人分组在一起。因此:

  2. contact模型中,添加belongs_to :category并移除belongs_to :company

  3. 如果Users想要导入contacts,则
  4. usercontacts不必关联。如果您不需要此关联,或者与has_many :categories具有相同的has_many :contacts, through: :categoriescompanies关系,我会完全删除此关联。当然,请删除联系人中的belongs_to :user

答案 1 :(得分:0)

你可能会研究多态性。我正在做这样的事情虽然我脱掉了并重新命名了一些东西以更贴近你的问题。这是未经测试的,但可能有助于说明不同的方法

 class User < ActiveRecord::Base
      has_many :business_users
      has_many :businesses, :through => business_users   
      has_many :contacts, :through => :contact_users
      ...
    end

    class Contact < ActiveRecord::Base
      belongs_to :user
      belongs_to :company
      has_many :categorizations, :as => :categorizeable
      has_many :categories,  -> { order(created_at: :desc) }, :through => :categorizations
      ...
    end

    class Company < ActiveRecord::Base
      belongs_to :admin, :class_name => :User, :foreign_key => "user_id"
      has_many :company_users
      has_many :users, :through => :company_users
      has_many :categorizations, :as => :categorizeable
      has_many :categories,  -> { order(created_at: :desc) }, :through => :categorizations
      ...
    end

    class Category < ActiveRecord::Base
      belongs_to :categorizeable, polymorphic: true
      has_many :categorizations
      has_many :companies,  :through => :categorizations, :source => :categorized, :source_type => 'User'
      has_many :contacts,  :through => :categorizations, :source => :categorized, :source_type => 'Contact'
      ...
    end