Как я могу создавать, связывать и деассоциировать связанные записи в Rails ActiveRecord с accepts_nested_attributes_for - PullRequest
4 голосов
/ 07 января 2011

У меня типичные отношения has_many между двумя моделями (скажем, Article has_many Авторы.)

Форма «Моя статья» позволяет пользователю:

  1. Создайте новых авторов и свяжите их со статьей,
  2. Выберите существующих авторов для связи со статьей,
  3. Удалить связь с автором (без удаления записи об авторе.)

Я использую accepts_nested_attributes_for, и это отлично обрабатывает # 1. Тем не менее, мне еще предстоит найти лучший способ реализации # 2 и # 3, все еще используя acceptpts_nested_attributes_for.

На самом деле все это работало с Rails 3.0.0. ActiveRecord автоматически создаст новую ассоциацию, когда ему будет присвоен идентификатор автора, которого он раньше не видел. Но оказалось, что я случайно использовал ошибку безопасности, которая была исправлена ​​в Rails 3.0.1.

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

Любой совет будет признателен.

Спасибо

Рассел.

Ответы [ 3 ]

2 голосов
/ 11 декабря 2012

Предполагая, что вам, вероятно, нужно использовать соединительную таблицу.Попробуй:

class Article < ActiveRecord::Base
  has_many :article_authors
  accepts_nested_attributes_for :article_authors, allow_delete: true
end

class Author < ActiveRecord::Base
  has_many :article_authors
end

class ArticleAuthor < ActiveRecord::Base
  belongs_to :article
  belongs_to :author
  accepts.nested_attributes_for :author
end


# PUT /articles/:id
params = {
  id: 10,
  article_authors_attributes: {
    [
      # Case 1, create and associate new author, since no ID is provided
      {
        # A new ArticleAuthor row will be created since no ID is supplied
        author_attributes: {
          # A new Author will be created since no ID is supplied
          name: "New Author"
        }
      }

    ],
    [
      # Case 2, associate Author#100
      {
        # A new ArticleAuthor row will be created since no ID is supplied
        author_attributes: {
          # Referencing the existing Author#100
          id: 100
        }
      }
    ],
    [
      # Case 3, delete ArticleAuthor#101
      # Note that in this case you must provide the ID to the join table to delete
      {
        id: 1000,
        _destroy: 1
      }
    ]
  }
}
1 голос
/ 14 декабря 2012

Для полноты, способ, которым я делаю это сейчас, таков:

class Article < ActiveRecord::Base
  belongs_to :author, validate: false
  accepts_nested_attributes_for :author

  # This is called automatically when we save the article
  def autosave_associated_records_for_author
    if author.try(:name)
      self.author = Author.find_or_create_by_name(author.name)
    else
      self.author = nil # Remove the association if we send an empty text field
    end
  end

end

class Author < ActiveRecord::Base
  has_many :articles
end

Я не нашел способа проверки связанной модели (Автор) с помощью ее проверок ..

1 голос
/ 07 января 2011

Посмотрите на это: http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes

это для rails 2.3, но большая часть синтаксиса такая же, как и для rails3 ... Здесь упоминаются все, что вы ищете ..

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