2016-04-28 1 views
0

Я разрабатываю приложение rails, где пользователи могут добавлять задачи, которые они хотят сделать, в собственный собственный список. Каждая задача может также принадлежать 0 или более категориям. До сих пор я попытался это:Rails association - Индивидуальный список элементов из существующего списка

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 

[временная метка} _migration.rb

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

    t.timestamps null: false 
end 

Проблема, которую я имею в консоли я пытаюсь запустить User.find(1).tasks он не может найти столбец tasks.user_list_id при помощи следующего запроса:

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. Правильны ли ассоциации, и если да, то что я могу сделать, чтобы изменить запрос?

+0

у вас есть 'user_list_id' на задачах? почему бы просто не поместить 'user_id' в таблицу' tasks', тогда вам не понадобится 'user_tasks' – lusketeer

+0

@lusketeer, потому что задача может быть добавлена ​​к нескольким пользовательским спискам –

ответ

3

Для того, чтобы задачи были размещены во многих списках, вам нужна таблица соединений M2M, которая объединяет таблицы и tasks.

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

Ваш случай использования требует задача быть отнесен к более чем одному пользователю, и пользователь имеет только один список задач. Это звучит как ассоциация HABM между users и tasks.

Самый простой способ выразить это было бы:

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. Дайте мне знать, и я уточню свой ответ.

Вот документация по HABM и join migration