[英]Reverse Polymorphic Association in Rails (Accessing the parent's attributes)
我用以下問題的選定答案實現了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訪問該屬性? 所以基本上,我試圖從子對象訪問父對象的屬性。
請注意, t.article_elements
是一個集合。 我將使用article_element
來引用集合的一個成員。
根據您的示例,
article_element.element.picture_name
將工作。
但是,由於屬性不匹配,您遇到了未定義方法的問題。 例如,視頻將沒有picture_name
屬性。 如果所有元素類型都共享一個公共屬性,例如name
,那就很好了。
避免此問題的一種方法是檢查元素是否響應給定的屬性方法。 例如:
# 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
。
該解決方案有點笨拙,因此使用后果自負。 就個人而言,我將改用通用屬性。
我也有類似情況。
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關系相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.