Слияние имен полиморфных ассоциаций

Я пытаюсь реализовать полиморфную ассоциацию в проекте в первый раз, но я не поклонник того, как ассоциации читают, и задавался вопросом, есть ли способ их сглаживания?

Пример:

# 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,

1

Ответов: 1


2 принят

Вы можете использовать ассоциацию как любой другой метод:

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
рубин-на-рельсы, ActiveRecord, полиморфные-ассоциации,
Похожие вопросы