Успешным способом было бы добавить модель, которая служит соединением.Затем объединяемая таблица получит свой собственный ресурс.Модель соединения может называться, например, «Подписка», или, если вы не найдете подходящего имени, просто назовите его TaskUser.Эта часть направляющих рельсов имеет отношение: http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association
class Task
has_many :users, :through => "TaskUser"
end
class User
has_many :tasks, :through => "TaskUser"
end
class TaskUser
has_many :users
has_many :tasks
end
При отправке POST to /taskusers
с user_id
и task_id
после того, как вы объявили маршрут (например, добавив resource TaskUser
вroute.rb), вы создаете связь между двумя объектами.Контроллер должен включать что-то вроде этого:
class TaskUsersController
def create
TaskUser.create(:task_id => params[:task_id], :user_id => params[:user_id])
end
end
, после чего вы сможете получить доступ к задачам пользователя, просто позвонив
user.tasks
Лично я думаю, что есть ситуации, когда вы ненужно это решение, так как оно создает немало накладных расходов с дополнительной моделью и всем этим.
Например, у меня есть модель предмета и я хочу добавить к ней теги.Это ассоциация «многие ко многим», объявленная has_and_belongs_to_many
в каждой модели, но я всегда добавляю тег к элементу, а не наоборот, поэтому первое решение кажется немного большим.Затем я просто добавляю
put "/Items/#{item_id}/tags/#{tag_id}" => "items#add_tag"
в router.rb.ItemController:
class ItemController
def add_tag
item = Item.find_by_id(:item_id)
tag = Tag.find_by_id(:tag_id)
item.tags << tag
item.save
end
end
Надеюсь, это поможет в любом случае, даже если я только что увидел, что ответ опоздал на год.