0

У меня 3 основных модели: Статьи, Комментарии и Пользователи. В настоящее время комментарии вложены в статьи, тем не менее все комментарии к статье показаны на странице статьи. Моя «проблема» заключается в том, что комментарий должен принадлежать как пользователю, так и статье. Теперь, в создании действия моего comment_controller, трудно сделать 2 действия сборки одновременно. То, что я в принципе хочу это иRails 3 - выбор полиморфных ассоциаций?

@comment = @article.comments.build(params[:comment]) 

и

@comment = @user.comments.build(params[:comment]) 

в том же создавать действия моего comments_controller. Конечно, вы не можете выполнять обе строки одновременно, если я не ошибаюсь. По крайней мере, это не сделало бы того, что я хотел.

В моих комментариях я хочу вызвать информацию пользователя комментария, чтобы получить имя пользователя и его аватар. Я мог бы добавить столбец user_name к моим комментариям таблице и обрабатывать, что с

@user = current_user 
    @comment = @article.comments.build(params[:comment]) 
    @comment.user_name = @user.name 

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

Является единственным возможным способом создания 2 ассоциаций для комментария (со статьей и пользователем) с использованием полиморфных ассоциаций с «комментарием» интерфейса для модели пользователя и статьи? Я чувствую, что даже это не будет по-настоящему чисто логичным, поскольку пользователь на самом деле не комментирует, а скорее комментирует. Конечно, это отсутствие логики не будет проблемой для приложения, но нет ли другого решения для, на мой взгляд, довольно распространенной ситуации комментария, принадлежащего более чем одной модели? Любая помощь приветствуется! Спасибо!

ответ

0

Модель комментария должна иметь столбцы для article_id и user_id. Попробуйте положить скрытое поле в form_for:

<%= f.hidden_field(:comment_id, :value => @comment.id) %> 

Тогда при вызове @comment = current_user.comments.build(params[:comment]) он должен получить прошли вместе. А затем вы можете позвонить @comment.user.user_name.

+0

В общем, я согласен с этим подходом, но user_id, я думаю, слишком чувствительная информация, чтобы поместить его в скрытое поле. Кто-то может легко прокомментировать как другой пользователь, изменив этот идентификатор через firebug или так. Вчера у меня была эта идея, но я сделал чек с регистрацией в качестве пользователя, манипулируя user_id в скрытом поле с помощью firebug, и я действительно смог прокомментировать как любой пользователь, которого я хотел. Скрытые поля должны использоваться только для атрибутов, которые никто не заинтересован в манипулировании, я думаю. –

+0

Правда. Тогда вы могли бы справиться с этим с другой стороны. Я уточню свой ответ. – evanbikes

+0

Это отличная идея, я думаю. Таким образом, вы создаете '@comment = @ user.comments.build (params [: comment])' и создаете ассоциацию статей, хотя скрытое поле, которое не представляет проблемы, не вызывает интереса к его манипулированию. –

Смежные вопросы