Как использовать «многие ко многим» в Rails? - PullRequest
2 голосов
/ 02 июня 2010

В моем проекте есть пользователи и квесты. Один пользователь может присоединиться к нескольким квестам, а один квест может иметь несколько пользователей. Поэтому я создал таблицу под названием квест, в которой есть user_id и quest_id. В моем user.rb я сделал следующее:

require 'digest/sha1'
class User < ActiveRecord::Base
  has_many :questings
  has_many :quests ,:through =>:questings
  ...

My Quest.rb:

class Quest < ActiveRecord::Base
  has_many :questings
  has_many :users ,:through =>:questings
  ...

My Questing.rb:

class Questing < ActiveRecord::Base
  belongs_to :quest
  belongs_to :user
end

Теперь я хочу создать ссылку или кнопку на моем /quests/show.html.erb, вызывая действие в моем контроллере, которое создаст связь между пользователем и квестом.

Итак, в моем quest_controller я сделал:

  def join_quest
    @quest = Quest.find(params[:id])
    puts '************************'
    puts 'join quest:' + @quest.id
    puts '************************'
    respond_to do |format|
      format.html { redirect_to(@quest) }
      format.xml  { head :ok }
    end
  end

и в моем show.html.erb я сделал:

<%= link_to 'join this quest!!!', :action => :join_quest %>

Теперь нажатие на эту ссылку вызовет ошибку, такую ​​как: Couldn't find Quest with ID=join_quest, а URL указывает на / квесты / join_quest вместо / квестов / 1 / join_quest

Теперь мои вопросы:

Мой квест-контроллер - подходящее место для моего действия join_quest или я должен переместить его в свой users_controller?

Почему я получаю эту ошибку? Как это решить?

Что я должен написать в своем действии join_quest для сохранения отношений?

На моем /users/show.html.erb я хочу вывести все квесты, к которым присоединился пользователь. Как это сделать? Я должен получить все эти квесты из моей таблицы отношений, верно? Как?

Надеюсь, вы мне поможете! THX!

EDIT: При добавлении :member=>{:join_quest=>:get} в мой route.rb (map.resources :quests, :member=>{:join_quest=>:get}) он будет вызывать / квесты / 1 / join_quest и правильно называть мои действия. Но я все еще не могу понять, что написать в моем действии для сохранения соединения.

Ответы [ 2 ]

2 голосов
/ 02 июня 2010

Чтобы сохранить отношения, вам понадобится что-то вроде

# quests controller
@quest.questings.create(:user_id => current_user)

Но я предполагаю, что вы можете получить current_user.

Надеюсь, это поможет ...

Редактировать

Отвечая на ваши вопросы:

Является ли мой квест_контроллер правильным место для моего действия join_quest, или я должен переместить его в мой users_controller

Вы можете сделать это как в users, так и в quests controller, где бы это ни было лучше для вас.

Что я должен написать в моем Действие join_quest для сохранения отношения?

Ответил выше.

На моем /users/show.html.erb я хочу вывод всех квестов, к которым присоединился пользователь. Как сделать это? Я должен получить все это квесты из моей таблицы отношений, право? Как?

# users controller, show method
@user = User.find(params[:id], :include => :quests)

# show view
<% @user.quests.each do |quest| %>
   # print whatever you want from the quest
   <%= quest.any_attribute %>
<% end %>
1 голос
/ 02 июня 2010

Я предполагаю, что вы знаете текущего пользователя, когда находитесь в контроллере квестов. Если это так, то все, что вам нужно сделать, это.

@quest.users << current_user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...