2017-10-12 15 views
0

私はUserモデルとTaskモデルを持っています。すべてのユーザーは同じで、各ユーザーは新しいタスクを作成し、そのタスクを別のユーザーに割り当てることができます。タスクモデルでは、assigned_by列とassigned_to列があり、誰でも新しいタスクを作成して他の誰かに割り当てることができます。後で、各ユーザーが自分に割り当てられたすべてのタスクと、他のユーザーに割り当てられたすべてのタスクを表示できるようにしたいと考えています。これを行うには、関連付けを設定する必要があります。このようなことは大丈夫ですか?1つのモデル2つの関連付けを継承します

class Task < ApplicationRecord 
    belongs_to :user, :foreign_key => 'assigned_by' 
    belongs_to :user, :foreign_key => 'assigned_to' 
end 

私は同じモデルに2つの外部キーがあります。ユーザーモデルでは、私は持っています:

class User < ApplicationRecord 
    has_many :tasks 
end 

これは、このようなことを行う正しい方法ですか?

+0

大丈夫ですか?いいえ、2番目の 'belongs_to:user、:foreign_key => 'assigned_to''は前の関係を上書きします。 – max

答えて

1

2つのメソッドを同じ名前で定義することはできません(この場合は、両方ともuserと呼ばれます)。

より良い方法は、それを実際に何かによって関係を呼び出すことです。 は例

class Task < ApplicationRecord 
    belongs_to :assigned_by, class_name: 'User' 
    belongs_to :assigned_to, class_name: 'User' 
end 

のためにまた、あなたがtasks方法が曖昧であるとして、あなたのUserモデルを変更する必要があります、また、DB assigned_by_idassigned_to_id

で外部キーをforeign_keyオプションを追加したり、呼び出す必要があります。

class User < ApplicationRecord 
    has_many :tasks_delegated, foreign_key: 'assigned_by_id', class_name: 'Task' 
    has_many :tasks_assigned, foreign_key: 'assigned_to_id', class_name: 'Task' 
end 
1

のようにしてください。を上書きしないでください。あなたはおそらく欲しい

class User < ApplicationRecord 
    has_many :owned_tasks, class_name: "Task", foreign_key: "owner_id" 
    has_many :assigned_tasks, class_name: "Task", foreign_key: "assignee_id" 
end 

class Task < ApplicationRecord 
    belongs_to :owner, class_name: "User", foreign_key: "owner_id" 
    belongs_to :assignee, class_name: "User", foreign_key: "assignee_id" 
end 
2

はセットアップに3つのテーブルです:タスクは多くのユーザーに割り当てることができるように

class User < ApplicationRecord 
    has_many :assignments, foreign_key: 'assignee_id' 
    has_many :assignments_as_assigner, foreign_key: 'assignee_id' 
    has_many :tasks, through: :assignments 
    has_many :assigned_tasks, through: :assignments_as_assigner 
    has_many :created_tasks, class_name: 'Task' 
          foreign_key: 'creator' 
end 

class Task < ApplicationRecord 
    belongs_to :creator, class_name: 'User' 
    has_many :assignments 
end 

class Assignment < ApplicationRecord 
    belongs_to :assignee, class_name: 'User' 
    belongs_to :assigner, class_name: 'User' 
    belongs_to :task 
end 

これは、多くの関連するものを作成します。

モデル内の各関連付けには一意の名前が必要です。そうしないと、以前の関連付けを上書きします。

関連する問題