Построение и создание связанных объектов с помощью ассоциации: как установить внешний ключ вложенной модели?

#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:
    1. проверка самой статьи, успех!(ПРИМЕЧАНИЕ: примечание сохранено)
    2. проверьте article_category_relationship для каждой статьи.article_category_relationships, article_id не указан, сбой!

Что вы можете сделать

  1. сначала создайте статью
  2. присвойте параметры этой созданной статье
  3. обновление с помощью параметров