Логика контроллера для referenced_in и references_many в mongoid

Я пытался использовать mongoid с ассоциациями referenced_in и references_many. У меня есть две модели: User и Question. У вопроса может быть один автор, но пользователь может быть автором нескольких вопросов. Фрагмент ниже показывает структуру моделей.

class User
  include Mongoid::Document
  references_many :questions, :inverse_of => :poster, :dependent => :delete
end 

class Question
  include Mongoid::Document
  referenced_in :poster, :class_name => "User"
end

Теперь мой QuestionController#new выглядит следующим образом

def create
  @question = Question.new(params[:question])
  @question.poster = current_user

  if @question.save
    current_user.questions <<= @question
    current_user.update_attributes(:questions => current_user.questions)
  end
end

Поле question.poster заполнено правильно, но массив user.questions не заполнен. Какой будет правильная логика контроллера для этого?


person reddragon    schedule 27.02.2011    source источник


Ответы (2)


Ваша модель выглядит хорошо. Однако вам не нужно делать всю эту работу в вашем контроллере. Это должно выглядеть примерно так:

def create
  @question = current_user.questions.build(params[:question])

  if @question.save
    #redirect logic goes here
  end
end

Вам не нужно явно добавлять вопрос в массив вопросов пользователя.

person Paul Elliott    schedule 27.02.2011
comment
Привет Павел, Спасибо за ответ. Я пробовал это, но User.first.questions все равно возвращает nil. Хотя поле poster_id отражается в значениях вопроса, в пользователе нет соответствующего поля. Как я могу получить доступ к массиву вопросов пользователя? - person reddragon; 27.02.2011
comment
Когда вы вызываете это, он должен возвращать объект критерия. Какую версию монгоида вы используете? - person Paul Elliott; 01.03.2011
comment
Я использую 2.0.0.rc.6. Я получаю [], когда делаю User.last.questions (после попытки создать новый вопрос для последнего пользователя через приложение). - person reddragon; 03.03.2011
comment
Вы уверены, что вопрос актуален? Ошибка проверки не позволит ему сохраниться. - person Paul Elliott; 08.03.2011

Вы пробовали следующим образом

def create
  @question = Question.new(params[:question])

  if @question.valid?
    current_user.questions << @question

  end
end

<< перезаписывается монгоидом и сохраняет одновременно current_user и @question.

person kriysna    schedule 28.02.2011
comment
Спасибо, я пробовал, но это не сработало. Даже после этого массив вопросов по-прежнему пуст. irb(main):009:0> User.last.questions => [] - person reddragon; 01.03.2011