【问题标题】:Rails Polymorphic association child different columns [closed]Rails多态关联子不同列[关闭]
【发布时间】:2019-08-23 01:48:19
【问题描述】:

我有 4 个模型

Class Post 
 has_many: videos 
 has_many: documents
 has_many: checklists
end 

还有这些模特belongs_to帖子

Class Video
end 

Class Document
end 

Class Checklist
end 

样本记录看起来

id: 1, name 'sample post', media_type: 'video' 

渲染单个帖子时非常困难,我需要每次检查条件是什么媒体类型并使用相应的模型属性

例如:

@posts.each do |post|
   if @post.media_type =='video'
      render :video_html
   elsif @post.media_type =='document'
     render :document_html
   .....
   ....  
 end 

我不能使用polymorphic association,因为视频、文档、清单有不同的字段。

请建议以更好的方式设计模型

我需要的是:

@post.media

应该返回类似polymorphic 工作方式的媒体。

【问题讨论】:

  • 有什么问题?
  • 有没有最好的方法来设计这个模型?
  • 不可能根据您当前的层对您的模型层进行有意义的评论,并且没有解释它当前如何不适合您,或者您现有的架构是什么样的,或者您的任何用例是什么是。
  • 只是在这里吐口水,但您可以在 Post 和 Video/Document 之间进行连接,可能称为 PostMedia。 PostMedia belongs_to :media, polymorphic: true; belongs_to :post 然后 Post 可以 has_many :post_medias。在那里你也许可以做@post.post_medias. each { |post_media| post_media.media_type.eql?('Video') ? render :video_html .... }也许只是一个快速的想法:D

标签: ruby-on-rails ruby associations


【解决方案1】:

如果问题只是必须考虑每种视频类型的大 if,有几种方法可以解决这个问题。

最好的方式是只渲染集合:

不要这样做:

@posts.each do |post|
  # ... render the post ...
end

改为使用集合渲染:

render @posts

这将为集合中的每个项目呈现一个部分。部分渲染基于集合中每个项目的partial_path,默认情况下,app/views/videos/_video.html 用于Video 记录,app/views/documents/_document.html 用于Document 记录等。将您的 HTML 移动到位置Rails 期望找到它,你就完成了。

删除if 的第二种方法是使用简单的字符串插值:

@posts.each do |post|
  render "#{post.media_type}_html"
end

但最好只使用render @posts。它更简单,执行速度更快。

【讨论】:

  • 谢谢@meagar。我的目的是更好地设计模型
  • @ramamoorthy_villi...如何为某事物建模是非常主观的,这里的任何人都需要太多信息才能为您提供具体答案。但是,此答案为您提供了一种重构视图的可靠方法……它解决了您“渲染单个帖子时非常困难”的问题
  • @MarkMerritt 这只是一个场合,每次都很难为这个设计读取数据。我在找东西medium.com/@adamlangsner/…
  • 不明白你们为什么一直坚持@meagar
  • 它处于暂停状态,因为在当前状态下无法应答。再次......这个答案实际上解决了您概述的问题。与您的数据模型相关的任何其他答案都将是完全主观的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
相关资源
最近更新 更多