0

言い方がよくわからないので、以下に例を示します。

ProjectList と CategoryList が継承するモデル List があります。

ProjectList と CategoryList の両方で、次のように定義されています。

has_many :listed_items
attr_accessible :listed_attributes
accepts_nested_attributes_for :listed_attributes

さて、:listed_items は両方のクラスで異なるため、このコードを直接 List に貼り付けることはできません。

私が試したのはこれです(リスト内):

  class << self
    attr_accessor :listed

    def initialize_attributes!
      self.send :has_many, listed
      self.send :attr_accessible, "#{listed}_attributes"
      self.send :accepts_nested_attributes_for, listed, allow_destroy: true
    end
  end
  self.listed = nil

カテゴリリスト:

  self.listed = :categories
  self.initialize_attributes!

これは問題なく動作しますが、self.initialize_attributes! を呼び出さなければならないという事実があります。非常にハッキーな感じ。

より良い代替手段はありますか?

ありがとう!

編集:これが私が使用したものです

私が本当に望んでいたのは、継承されたモデルでこの二重線を取り除くことだけだったので、名前を変更def initialize_attributes!して、変数def has_many_lists(list)を取り除きました。:listedだから今has_many_lists :categories、私は継承されたモデルを呼び出します...

4

1 に答える 1

1

.inherited()フックはそこで便利です

http://ruby.runpaint.org/classes#class-inherited

于 2012-12-13T08:56:09.953 に答える