我很难理解模型关联,以及如何正确设置它们。我希望有人在这里知道如何,我可以解释我想要完成的任务。
我有一个如下所示的用户模型:
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
联系人属于用户(导入他们的用户)但是他们也是公司资产的一部分(与用户所做的所有操作一样),他们不一定需要成为公司的一部分。类别,但他们可以 - 也可以是几个类别的一部分。
我确定存在一些缺陷,我现在想修复我的关联,所以我最终不会在错误的结构上构建大量代码。
希望有人可以帮助我,如何清理这个相对较大的应用程序,为新手
答案 0 :(得分:0)
我会改变一些事情:
在company
模型中,将has_many :contacts
更改为has_many :contacts, through: :categories
。似乎categories
仅用于将联系人分组在一起。因此:
在contact
模型中,添加belongs_to :category
并移除belongs_to :company
Users
想要导入contacts
,则 user
和contacts
不必关联。如果您不需要此关联,或者与has_many :categories
具有相同的has_many :contacts, through: :categories
和companies
关系,我会完全删除此关联。当然,请删除联系人中的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