Я пытаюсь реализовать полиморфную ассоциацию в проекте в первый раз, но я не поклонник того, как ассоциации читают, и задавался вопросом, есть ли способ их сглаживания?
Пример:
# 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
но, по-моему , он не читается хорошо. Есть ли способ псевдонимов разных имен ассоциаций в модели Comment и избегать использования одного имени, такого как Comment.first.post
? Я понимаю , что вы можете выбрать имя , которое совпадет лучше конкретной DSL , а не говорить " класс Комментарий < ActiveRecord :: Base belongs_to : commentable , : полиморфный => верно alias_method : пост , : commentable alias_method : картина , : commentable end ", однако я предпочел бы продолжать ссылаться на ассоциации с именами (или вариациями) на основе их отношений, аналогичных Comment.first.post
и` Comment.first.picture ', если это вообще возможно.
В конце концов, это не большая жертва за гибкость, которую вы получаете от полиморфных ассоциаций. Просто любопытно, существует ли решение.
Примечание: следующий пример был взят из проекта «Один», который отлично справляется с объяснением различных типов ассоциаций.
ruby-on-rails,activerecord,polymorphic-associations,
Вы можете использовать ассоциацию как любой другой метод:
Picture
И вы можете сделать post
и Comment.first.commentable
.
Но Post
может быть либо a, Post
либо a picture
, поэтому вы должны знать, что вы делаете.
Другой подход заключается в реализации методов , которые возвращают post
только если commentable
это Post
и Picture
только тогда , когда commentable
это Picture
:
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