我正在构建一个用户可以拥有许多客户端(不能在用户之间共享)的应用程序。
这是一个相当小的应用程序,但可能会发生两个客户端属于同一个组织的情况。因此,最好有一个额外的表格来保存有关该组织的所有信息。客户也可能是私人客户并且不属于任何组织。
我知道这在数据库设计中是相当普遍的,但是如何在 Rails 中建模呢?
我正在构建一个用户可以拥有许多客户端(不能在用户之间共享)的应用程序。
这是一个相当小的应用程序,但可能会发生两个客户端属于同一个组织的情况。因此,最好有一个额外的表格来保存有关该组织的所有信息。客户也可能是私人客户并且不属于任何组织。
我知道这在数据库设计中是相当普遍的,但是如何在 Rails 中建模呢?
组织与用户的关系如何?如果用户和组织彼此独立,最简单的解决方案是拥有......
User - has_many :clients
Organization - has_many :clients
Client - belongs_to :user, belongs_to :organization
但我猜这里涉及的更多?您是否正在寻找多对多的解决方案?
答案是@peter-duijnstee 所说的,并提出了额外的限制:
class Organization < ActiveRecord::Base
belongs_to :user
validates :user, :presence => true
end
class Client < ActiveRecord::Base
belongs_to :user
belongs_to :organization
# note the final "s", it validates a field
validates :user, :presence => true
# no final "s", validate using a method
validate :organization_user, :if => :organization_present?
def organization_present?
organization.present?
end
def organization_user
errors.add(:organization_id, "is not allowed") unless organization.user_id == user_id
end
end
User has many clients.
Client belongs to user.
这相当简单。如果您使用的是关系数据库,“clients”表将有一个外键“user_id”。
在客户和组织之间,是一对多的吗?还是多对多?如果是一对多,你可以这样做
Organization has many clients.
Client belongs to organization.
如果是多对多,则需要一个映射表
Organization has and belongs to many clients.
Client has and belongs to many organizations.
在此处了解有关 Rails ActiveRecord 中关联的更多信息