簡體   English   中英

Rails中的反向多態關聯(訪問父級的屬性)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM