1

この質問から選択した回答を使用して、Railsでの逆ポリモーフィズムの例を実装しました: 逆ポリモーフィズムの関連付け

これにより、次のことが可能になります。

t = Article.new
t.article_elements  # []
p = Picture.new
t.article_elements.create(:element => p)
t.article_elements  # [<ArticleElement id: 1, article_id: 1, element_id: 1, element_type: "Picture", created_at: "2011-09-26 18:26:45", updated_at: "2011-09-26 18:26:45">]
t.pictures # [#<Picture id: 1, created_at: "2011-09-26 18:26:45", updated_at: "2011-09-26 18:26:45">]

t.article_elementsこれを変更して、写真の属性も表示できるように変更できるかどうか疑問に思ってい ます。たとえば、変数pのpicture_name属性がある場合、t.article_elementsからどのようにアクセスできますか?つまり、基本的に、子オブジェクトから親の属性にアクセスしようとしています。

4

2 に答える 2

1

t.article_elementsそれはコレクションであることに注意してください。article_elementコレクションの1つのメンバーを参照するために使用します。

あなたの例によると、

article_element.element.picture_name 

動作します。

ただし、属性の不一致により、未定義のメソッドで問題が発生します。たとえば、ビデオにはpicture_name属性がありません。すべての要素タイプがなどの共通の属性を共有しているname場合は問題ありません。

この問題を回避する1つの方法は、要素が特定の属性メソッドに応答するかどうかを確認することです。例えば:

# models/article_element.rb
def element_try(method)
  self.element.respond_to?(method) ? self.element.send(method) : ""
end

私たちの要素がビデオであり、私たちが呼び出す場合:

article_element.element_try(:picture_name) # => ""

の代わりに空白の文字列を取得しますNoMethodError

このソリューションは少しハッキーなので、自己責任で使用してください。個人的には、代わりに共通の属性を使用します。

于 2013-01-20T11:38:14.433 に答える
-1

私も似たような状況でした。

class User < ActiveRecord::Base
    has_one :image, as: :imageable
end
class Person < ActiveRecord::Base
    has_one :image, as: :imageable
end
class Image < ActiveRecord::Base
    belongs_to :imageable, :polymorphic => true
end

画像の親にアクセスしたい場合は、Image.last.imageableそれを行うと、 User または Person オブジェクトのいずれかが得られます。has_many リレーションと同じように機能します。

于 2013-11-20T20:00:45.913 に答える