创建DRY内容模型层次结构的最佳方法是什么?

时间:2014-09-09 17:35:45

标签: ruby-on-rails ruby oop architecture

我有使用rails构建的iOS应用程序的内容管理系统。现在有三种不同类型的内容。前两个只是用户上传到文本字段的字符串。一个是twitter句柄和主题标签,另一个是URL。第二种是照片。

用户可以上传这些类型内容的多个单独实例,因为他/她希望提供 feed ,然后通过API调用将其传递给iOS应用以进行显示。

我目前使用的方法是拥有Feed,图片,Twitter和网页模型。当用户创建新Feed时,他们会通过每个Feed实例的内容实例之间的一对多关系将相应内容与该Feed相关联。

当显示用户上传的内容时,会生成给定流的GET请求,然后Feed模型会执行以下可怕的操作来确定应显示的内容类型:

 def Feed.get_content_for_feed(feed_id)
    return self.map_type_to_class(feed_id).get_content_for_feed(feed_id)
  end

  private

  def Feed.map_type_to_class(feed_id)
    feed_type_id = Feed.find(feed_id).feed_type_id
    not_yet_implemented = nil
    case stream_type_id
      when 1
        return Webpages
      when 2
        return Pictures
      when 3
        return not_yet_implemented
      when 4
        return Twitter
      when 5
        return not_yet_implemented
      when 6
        return not_yet_implemented
      when 7
        return not_yet_implemented
      when 8
        return not_yet_implemented
      else
        return nil

    end
  end

然后每个内容类实现一个get_content_for_feed方法来返回内容:

def Twitter.get_content_for_feed(feed_id)
    tweet_urls = self.where(:feed_id => feed_id.to_i)
    if tweet_urls.empty?
      return []
    else
      return tweet_urls
    end
  end

所以它只返回适当的类。这有效,但我知道这是错的,但我不确定我会做什么。

1 个答案:

答案 0 :(得分:0)

这对你有用吗<​​/ p>

class User
  has_many :feeds
  has_many :twitters, through: :feeds, source: :feedable, source_type: 'Twitter'
  has_many :webpages, through: :feeds, source: :feedable, source_type: 'Webpage'
  has_many :pictures, through: :feeds, source: :feedable, source_type: 'Picture'
end

class Feed
  belongs_to :user
  belongs_to :feedable, polymorphic: true
end

现在,您的feeds表格需要feedable_idfeedable_type,然后关联将按预期工作。 e.g。

Website.create name: "website", url: "http://www.example.com"
user = User.create name: "User"
feed = user.feeds.build
feed.feedable = Website.find_by_name("website")
feed.save

我没有通过多态来获得这种has_many的丰富经验,但从概念上讲,这应该适合你。如果你没有完全解决问题,那么如果你Google polymorphic has_many through,就会有大量的SO问题和文章。