связать вложенные атрибуты с идентификаторами, которые они получают после сохранения - PullRequest
3 голосов
/ 15 декабря 2010
class Member < ActiveRecord::Base
  has_many :posts
  accepts_nested_attributes_for :posts
end

params = { :member => {
  :name => 'joe', :posts_attributes => [
    { :title => 'Kari, the awesome Ruby documentation browser!' },
    { :title => 'The egalitarian assumption of the modern citizen' },
  ]
}}

member = Member.create(params['member'])

После этого я хочу сопоставить элементы в posts_attributes в хэше params с идентификаторами (первичными ключами) после их сохранения.Есть ли что-то, что я могу сделать, когда acceptpts_nested_attributes_for строит или создает каждую запись

PS: массив posts_attributes может не содержать индекс в последовательности., 127653,7863487, так как я динамически создаю элементы формы с помощью javascript

, я также хочу связать только новые записи, созданные в Post и не существующие Post

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 15 декабря 2010

Рассматривали ли вы обновление ассоциации posts и полный захват массива posts_attributes?

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

0 голосов
/ 15 декабря 2010

Хотя я не совсем уверен, какие элементы вы хотите назначить с какими идентификаторами, я думаю, что этот подход даст вам подсказку.

Вы можете назначить символ имени метода для :reject_if, затемвставьте свою логику в этот метод, например так:

class Member < ActiveRecord::Base
  has_many :posts
  accepts_nested_attributes_for :posts, :reject_if => :reject_posts?

  def reject_posts?(attrs)
    # You can do some assignment here
    return true if attrs["title"].blank?
    post_exist = self.posts.detect do |p|
      p.title == attrs["title"]
    end
    return post_exist
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...