2016-10-16 57 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'也是相同的。请看一看。谢谢 –