2017-03-26 20 views
1

CASEActiveRecordの協会:1対多の関係

私は、次のテーブルで構成されたモデルに取り組んでいます:

  • ユーザー
  • 企業
  • コメント(参加テーブル)

私が探している関係は:

  • ユーザーhas_manyがコメントします。
  • A社has_manyコメント。
  • A会社has_manyユーザー。
  • ですが、ユーザは必ずしもbelongs_toとは限りません。

ユーザーは基本的に、名前、姓などの情報を参照してログインすることができますが、ユーザーは単純な訪問者でも会社の従業員でもかまいません。

たとえば、ユーザは、現在belongs_toの会社を割り当てることを選択できますが、必須ではありません。


APPROACH

私はこれを達成するための方法で考えていた:

が2つのユーザー表の作成、1は、例えば従業員他の1人の訪問者である可能性があります。しかし、あなたのステータスを変更するケースはカバーしていないようです。たとえば、belongs_toをもう使用したくない場合、このアプローチは非効率的です。

または、ユーザーテーブルのブール値列を使用すると、"employee?", :boolean, default: falseです。私はどのようにこのthoを処理するか分からない。偽から真に切り替えてユーザーを会社に割り当て、その逆の方法は?


QUESTION

両方のステータス-visitorsを処理し、employees-と動的に別のカテゴリから切り替えるには1つのユーザーテーブルによる方法はありますか?事前

答えて

2

ありがとうございます2つのステップでそれを行うことがあります。オプション

1.Make belongs_to関係:

# User model 
belongs_to :company, optional: true 

2。訪問者と従業員が異なるスコープと方法を作成する:

# User model 
scope :visitors, -> { where(company: nil) } 
scope :employees, -> { where.not(company: nil) } 

def visitor? 
    company_id.nil? 
end 

def employee? 
    !visitor? 
end 

それだけです。今度は次のようにすることができます:

User.visitors 
User.employees 

User.find(id).visitor? 
+0

これはありがとう、私は範囲について考えています。フードの下で何が起こっているのかわからない:{where.not(location:nil)} –

+0

申し訳ありませんが、スペルが間違っていました。 '{where(company:nil)} 'とちょうど反対の' {where.not(company:nil)}'でなければなりません。 –

+0

それは私が思ったことです、編集のおかげで。だから、ユーザーのテーブル上のシンプルな会社の外部キーは、範囲のおかげで仕事をしますか?追加の結合表はありませんか? –