Модель Rails Activerecord с 2 внешними ключами, ни одна из них недоступна - PullRequest
0 голосов
/ 18 февраля 2011

Привет всем, у меня есть сценарий, который я действительно пытаюсь выяснить.Я пытаюсь создать собственный блог в Rails, который требует, чтобы пользователи вошли в систему, чтобы оставить комментарий.В основном у меня есть 3 модели - сообщение, пользователь и комментарий.Моя проблема в основном с моделью комментариев.Я пытаюсь сделать так, чтобы комментарий принадлежал пользователю, а также принадлежал посту, который имеет много комментариев.Я также сделал недоступными post_id и user_id, поскольку не хочу, чтобы они были подделаны (я хочу, чтобы комментарий автоматически ассоциировался с идентификатором поста, на котором он был оставлен, и я хочу, чтобы пользователь автоматически определялсячерез сессию).Моя проблема в том, что я не совсем уверен, как я могу создать правильный комментарий.Если я пытаюсь добавить комментарий, делая @ blog.comments.build (@attr), я игнорирую недоступного пользователя и, конечно, если я пытаюсь создать его через пользователя, я игнорирую блог.

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

Ответы [ 2 ]

1 голос
/ 19 февраля 2011

Я предполагаю, что у вас есть это в модели комментариев:

attr_accessible :content

, и когда вы пытаетесь создать комментарий, это происходит:

@post = Post.first
@post.comments.build(:user=>current_user)
# => WARNING: Can't mass-assign protected attributes: user

Так что это не сработает.

Если вы хотите защитить user_id и post_id от перезаписи в обновлении, вы можете сделать это:

attr_accessible :content, :user_id, :post_id
attr_readonly :user_id, :post_id

@post = Post.first
@post.comments.build(:user=>current_user)
@post.save! 
# sets user_id when creating
@post.user_id = 37
@post.save! 
# saves, but user_id is not changed. No warning is logged.
@post.update_attributes(:user_id=>37)
# same as above
@post.update_attribute(:user_id,37)
# raises ActiveRecord::ActiveRecordError: user_id is marked as readonly

Но это выглядит как перебор, так как, по-видимому, ваше приложение не отправит формус user_id для существующего комментария, и кто-то должен будет написать свою форму и опубликовать ее, чтобы изменить идентификатор.

1 голос
/ 18 февраля 2011

Вы всегда можете просто установить отношение вручную:

comment = @post.build(@attr)
comment.user = @user
comment.save

По крайней мере, я уверен, что это сработает.

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