#ruby-on-rails #ruby #ruby-on-rails-3 #model #nested
#ruby-on-rails #ruby #ruby-on-rails-3 #Модель #вложенный
Вопрос:
Я использую Ruby on Rails 3.1.0. Я пытаюсь сохранить вложенную модель, имеющую атрибут, предназначенный для хранения внешнего ключа родительской модели. Во время создания родительской модели я хотел бы присвоить этому значению атрибута значение родительской модели id
.
В моей модели у меня есть:
class Article < ActiveRecord::Base
has_many :article_category_relationships
has_many :categories,
:through => :article_category_relationships
# Accept nested model attributes
accepts_nested_attributes_for :articles_category_relationships
end
class Category < ActiveRecord::Base
has_many :article_category_relationships
has_many :articles,
:through => :article_category_relationships
end
# The join model:
class ArticleCategoryRelationship < ActiveRecord::Base
# Table columns are:
# - article_id
# - category_id
# - user_id
# - ...
belongs_to :category
belongs_to :article
end
На мой взгляд, у меня есть следующее:
...
<% @current_user.article_categories.each do |article_category| %>
<%= check_box_tag 'article[articles_category_relationships_attributes][][category_id]', article_category.id, false %>
<% end %>
В моем контроллере у меня есть:
def create
@article = Article.new(params[:article])
...
end
В моем случае article_id
(связанному с ArticleCategoryRelationship
вложенной моделью) должно быть присвоено @article.id
значение после Article
создания, и проблема в том, что платформа Ruby on Rails, похоже, не устанавливает это значение во время создания.В нескольких словах, учитывая мой случай, я хотел бы автоматически присоединить внешний ключ.
Просто чтобы знать, генерируемое params
при отправке формы:
"article"=>{"title"=>"Sample title", "articles_category_relationships_attributes"=>[{"category_id"=>"8"}, {"category_id"=>"9"}, {"category_id"=>"10"}] }
Возможно ли «автоматически» установить внешний ключ ( article_id
) вложенной модели? Если да, то как я могу это сделать?
Ответ №1:
попробуйте использовать :
@a_particular_article.article_category_relationships.build(params[:something])
вы можете посмотреть здесь для получения дополнительной информации и, возможно, захотите взглянуть на вложенные атрибуты и на validates_associated
Ответ №2:
На мой взгляд, вы просто НЕ МОЖЕТЕ этого сделать.
- Если вы хотите сохранить article_category_relationships , вам нужен article_id для каждого из них.
- И когда вы сохраняете article, rails сначала проверяет article и все подобъекты. Это означает
article.valid?
, что должно быть true, прежде чем вы сможете сохранить какую-либо запись. - Поскольку у статьи нет идентификатора перед сохранением в БД, article_id в любом из article_category_relationships пуст. Поэтому
article.valid?
всегда будет false, если вам нужно одновременно СОЗДАВАТЬ новую статью и ее подобъекты - Подводя итог, вот шаги rails:
- проверка самой статьи, успех!(ПРИМЕЧАНИЕ: примечание сохранено)
- проверьте article_category_relationship для каждой статьи.article_category_relationships, article_id не указан, сбой!
Что вы можете сделать
- сначала создайте статью
- присвойте параметры этой созданной статье
- обновление с помощью параметров