2016-04-28 8 views
0

私は自分が望むタスクを自分のカスタマイズしたリストに追加できるようなレールアプリを開発しています。各タスクは、0以上のカテゴリに属する​​こともできます。これまでのところ私はこれを試してみた:Rails association - 既存のリストからのカスタマイズされたリスト

_migration.rb

user.rb

has_one :user_list 
has_many :tasks, through: :user_list 

user_list.rb

belongs_to :user 
has_many :tasks 

tasks.rb

has_and_belongs_to_many :categories 

[タイムスタンプ}

create_table :user_lists do |t| 
    t.integer :user_id 
    t.integer :task_id 

    t.timestamps null: false 
end 

私が午前問題は、私は次のクエリを使用しているとき、それは列tasks.user_list_idを見つけることができませんUser.find(1).tasksを実行しようとするコンソールである:

SELECT "tasks".* FROM "tasks" INNER JOIN "user_lists" ON "tasks"."user_list_id" = "user_lists"."id" WHERE "user_lists"."user_id" = ? [["user_id", 1]] 

このクエリはとタスクテーブルからタスクIDを加入する必要がありますuser_listsテーブルのtasks id。アソシエーションは正しいのですか?もしそうなら、私はクエリを変更するために何ができますか?

+0

ですか? 'task'テーブルに' user_id'を置くだけではなく、複数のuser_listにタスクを追加できるので、 'user_tasks'は不要です@ – lusketeer

+0

@lusketeer –

答えて

3

多くのリストにタスクを配置できるようにするには、user_listsテーブルとtasksテーブルを結合するM2M結合テーブルが必要です。

あなたはと結合モデルと移行を作成することができます
class User < ActiveRecord::Base 
    has_many :user_lists 
    has_many :tasks, through: :user_lists 
end 

class Task < ActiveRecord::Base 
    has_many :user_list_items 
    has_many :user_lists, through: :user_list_items 
end 

class UserListItem < ActiveRecord::Base 
    belongs_to :task 
    belongs_to :user_list 
    has_one :user, through: :user_list 
    # optional 
    validates_uniqueness_of :task_id, scope: :user_list_id 
end 

class UserList < ActiveRecord::Base 
    belongs_to :user 
    has_many :user_list_items 
    has_many :tasks, through: :user_list_items 
end 

:あなたはまた、移行を開き、複合インデックスを追加することもでき

rails g model UserListItem user_list:belongs_to task:belongs_to 

add_index :user_list_items, [:user_list_id, :task_id], unique: true 

がユニークとしてそれを設定しますオプションですが、ほとんどの場合、テーブルAとテーブルBのテーブルエントリを一意にする必要があります。

参照:

0

タスクが複数のユーザーに割り当てられるためにご使用の場合は、呼び出して、ユーザーが唯一のタスクリストを持っています。これは、userstasksの間のHABM関連のようです。それを表現する

最も簡単な方法は、次のようになります。

class User 
    has_and_belongs_to_many: :tasks 
    ... 
end 

class Task 
    has_and_belongs_to_many: :users 
    ... 
end 

と結合テーブルを作成するための移行:

create_join_table :users, :tasks, do |t| 
    t.index :user_id 
    t.index.task_id 
end 

ジョインに一致するようにTaskUserモデルを作成する必要はありません追加の属性を追跡する必要があるまでRailsはそれを自動的に処理します。

ユーザーが複数のタスクリストを必要とする場合は、TaskListモデルが必要です。私に知らせてください、私は私の答えを更新します。

は、ここでは、 `タスクのuser_list_id`を持っているんHABM上のドキュメントやjoin migration

関連する問題