Создание и создание связанных объектов с помощью ассоциации: как установить внешний ключ для вложенной модели? - PullRequest
1 голос
/ 02 октября 2011

Я использую 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) для вложенной модели? Если так, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2013

По-моему, вы просто НЕ МОЖЕТЕ это сделать.

  • Если вы хотите сохранить article_category_relationships, вам нужен article_id для каждого из них.
  • И, когда вы сохраняете статью, rails сначала проверит статью и все подобъекты. Это означает article.valid? должно быть истинно, прежде чем вы сможете сохранить любую запись.
  • Так как article не имеет идентификатора перед сохранением в db, article_id в любом из article_category_relationships пуст. Следовательно, article.valid? всегда будет ложным, если вам нужно CREATE новая статья и ее подобъекты одновременно
  • Подводя итог, вот шаги рельсов:
    1. Подтвердите саму статью, успех! (ПРИМЕЧАНИЕ: примечание сохранено)
    2. проверить article_category_relationship для каждого из article.articles_category_relationships, article_id не указан, ошибка!

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

  1. сначала создайте статью
  2. назначить параметры этой созданной статье
  3. обновление с параметрами
0 голосов
/ 04 октября 2011

попробуйте использовать:

@a_particular_article.article_category_relationships.build(params[:something])

вы можете увидеть здесь для получения дополнительной информации и, возможно, захотите взглянуть на вложенные атрибуты и validates_associated

...