2016-10-16 82 views
0

我試圖在項目中首次實現多態關聯,但我不是一個協會如何閱讀和想知道如果有別名的方式他們的粉絲?別名的多態關聯名稱

例子:

# app/models/comment.rb 
class Comment < ActiveRecord::Base 
    belongs_to :commentable, :polymorphic => true 
end 

# app/models/post.rb 
class Post < ActiveRecord::Base 
    has_many :comments, :as => :commentable 
end 

# app/models/picture.rb 
class Picture < ActiveRecord::Base 
    has_many :comments, :as => :commentable 
end 

比方說,我想找回從給定評論過的信息例如,terrific_post = Comment.first.commentable只是沒有在我看來讀好。有沒有辦法在評論模型中別名不同的關聯名稱,並避免依賴單個名稱,如commentable?我意識到你可以選擇一個更符合你的具體dsl的名字,而不是說「可評論的」,但是我寧願繼續參考與他們的關係有關的姓名(或變體)的關聯,類似於Comment.first.post和`Comment.first如果可能的話。

在一天結束的時候,對於多態關聯的靈活性並不是很大的犧牲。只是好奇,如果解決方案存在。

注意:以下示例取自The Odin Project,它很好地解釋了各種關聯類型。

回答

1

您可以別名像任何其他方法的關聯關係:

class Comment < ActiveRecord::Base 
    belongs_to :commentable, :polymorphic => true 
    alias_method :post, :commentable 
    alias_method :picture, :commentable 
end 

然後你就可以做Comment.first.postComment.first.picture

Comment.first.post可以是PostPicture, 所以你應該知道你在做什麼。

另一種方法是實現一個返回post只有commentablePostpicture方法只有當commentablePicture

class Comment < ActiveRecord::Base 
    belongs_to :commentable, polymorphic: true 

    def post 
    commentable if commentable.is_a? Post 
    end 

    def picture 
    commentable if commentable.is_a? Picture 
    end 
end 
+0

非常感謝您!似乎完美地工作。在覆蓋主動記錄方法時,我一直有些猶豫,不想在軌道外面用軌道來覆蓋主動記錄方式,有些猶豫不決,以免覆蓋積極記錄 – Dom

+0

* Ugh原諒那些亂碼,在旅途中打字並不總是一個好主意。我試圖詢問如何覆蓋activerecord方法。在過去,我被警告過,但至少在這種情況下,它似乎工作得很好。採取這種方法會有什麼需要注意的嗎? – Dom

+0

我已經更新了答案,以確保'Comment#post'方法只返回'Post'或nil類型的實體,並且'Comment#picture'也是相同的。請看一看。謝謝 –