0

ネストされたパラメータを受け入れるモデルがあります。

class Publication < ActiveRecord::Base
  attr_accessible :authors_attributes, :title

  has_many :authors
  accepts_nested_attributes_for :authors
end

コールバックで、before_create同じタイトルと著者の別の出版物が存在するかどうかを確認したいと思います。コールバックは次のようになります。

def find_duplicate
  Publication.where(self.instance_values["attributes"].except("id", "created_at",
    "updated_at")).each do |publication|
      if publication.author_names.sort == @authors
        return publication
      end
  end
end

問題は、どうやって入手するのかわからないということです@authors。と同様の方法でパラメータを取得できると思いますがself.instance_values["author_attributes"]、それはnilになります。他にどのようにパラメータにアクセスできますか?

4

1 に答える 1

1

has_manyで構築されたアクセサーとして「authors」が必要です。したがって、@ authorsの代わりに、「authors」または「self.authors」を使用して、作成されようとしている(永続化されていない)作成者オブジェクトを取得します。次のようなものを試してください:

Publication.where(self.instance_values["attributes"].except("id", "created_at",
    "updated_at")).each do |publication|
      if publication.authors.collect{|a| a.name}.sort == self.authors.collect{|a| a.name}.sort
        return publication
      end
  end

ここで著者名を比較するためのより効率的な方法があると思われますが、これはあなたのパラダイムを説明し、維持するための最も明確な方法です。

于 2013-02-05T19:14:15.327 に答える