ユーザーが多くのクライアントを持つことができる(ユーザー間で共有できない)アプリケーションを構築しています。
これはかなり小さなアプリケーションですが、2つのクライアントが同じ組織に属している可能性があります。したがって、組織に関するすべての情報を保持するための追加のテーブルがあると便利です。クライアントがプライベートクライアントであり、どの組織にも属していない場合もあります。
データベース設計ではこれはかなり一般的ですが、Railsでこれをどのようにモデル化できますか?
ユーザーが多くのクライアントを持つことができる(ユーザー間で共有できない)アプリケーションを構築しています。
これはかなり小さなアプリケーションですが、2つのクライアントが同じ組織に属している可能性があります。したがって、組織に関するすべての情報を保持するための追加のテーブルがあると便利です。クライアントがプライベートクライアントであり、どの組織にも属していない場合もあります。
データベース設計ではこれはかなり一般的ですが、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」があります。
クライアントと組織の間で、それは1対多ですか?または多対多?1対多の場合は、次のことができます
Organization has many clients.
Client belongs to organization.
多対多の場合は、マッピングテーブルが必要になります
Organization has and belongs to many clients.
Client has and belongs to many organizations.
Rails ActiveRecordの関連付けについて詳しくは、こちらをご覧ください