我有使用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
所以它只返回适当的类。这有效,但我知道这是错的,但我不确定我会做什么。
答案 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_id
和feedable_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问题和文章。