2010-02-14 79 views
2

我正在尝试使用mongo_mapper在Rails上使用mongodb创建第一个应用程序,并且我正在权衡我的选项,如下面的STI模型。mongodb数据设计问题

它工作正常,我当然会加入到这个在很多方面比我目前可以指望,我只是好奇,如果我不会与嵌入文档或一些这样更好。

我想我的模型,因为它们都继承某些属性共享尽可能多的,即共享的形式财产/ _form.html.erb部分......除了自己独特的表单元素等。我知道意见会有所不同,但我不确定在控制器上,因为我可以使用属性控制器,我承担大多数事情?我相信随着我的进步它会变得更加复杂。

任何指针资源和/或智慧(节省疼痛提示)将不胜感激

property.rb

class Property 
     include MongoMapper::Document 

     key :name, String, :required => true 
     key :_type, String, :required => true 
     key :location_id, Integer, :required => true 
     key :description, String 
     key :phone, String 
     key :address, String 
     key :url, String 
     key :lat, Numeric 
     key :lng, Numeric 
     key :user_id, Integer, :required => true 
     timestamps! 

    end 

餐厅

class Restaurant < Property 
    key :cuisine_types, Array, :required => true 

end 

class Bar < Property 
    key :beers_on_tap, Array 

end 
+0

我还需要各种各样的东西...没有特定的模型,即cuisine_types,beers_on_taps ...类似于标签我想,但没有一百万个模型运行,多态集合? – holden 2010-02-14 22:49:08

+0

这也有帮助:http://code.alexreisner.com/articles/single-table-inheritance-in-rails.html – holden 2010-02-16 00:08:11

回答

3

不要b因为害怕更多的模型,面向对象的想法是能够将你的疑虑分解成小块,然后以他们需要治疗的方式对待它们中的每一个。

例如,您的Property模型似乎做了很多。为什么不把你打算进入EmbeddedDocument(lat,lng,address等)的地理资料拆分出来?这样你的代码将会保持简单和可读性。

我用这种STI的自己,我觉得它使我的代码更简单,更可用。使用像Mongo这样的数据库的好处之一是你可以像这样做非常复杂的STI,并且仍然有一个可管理的数据集合。

关于你cuisine_types和beers_on_tap等,我觉得这些都是细小的概念。如果您还有Cuisine和Beer模型,那么您的数据库可能会更加标准化(这在Mongo中很容易丢失)。例如:

class Bar < Property 
    key :beer_ids, Array 
    many :beers, :in => :beer_ids 
end 
class Beer 
    include MongoMapper:Document 
    key :name, String 
end 
+0

感谢您的意见,它非常有帮助。另外,你对路线有什么看法?我想使用相同的控制器的属性和她的孩子,但我不知道如何工作,仍然使用路线......即类似餐厅的路线仍然使用财产管理者,但每个子类别的具体视图部分......这是可行的吗? – holden 2010-02-16 00:07:48

+0

当然,我所做的是(基本上)将特定实例的类名转换为字符串并使用此帮助方法呈现该部分: (将TabContainerNode转换为tab_container) 'def partial_for(node) node.class。 to_s.underscore.gsub(/ _ node $ /,“”) end' gsub是可选的,当然,我只是不喜欢在所有节点上都有_node。 那么你有部分名称,你可以在视图中渲染它: <%= render:partial => partial_for(node),:object => node%> – joshsz 2010-02-16 15:00:09

+0

但是,我怎样才能使用像/餐厅是属性的一个子类,并将此信息传递给控制器​​? map.resources:restaurants,:controller =>:属性使路线起作用,但是我无法确定哪些网址带他们去展示餐馆,而不是所有的属性? – holden 2010-02-16 22:14:49

0

您是否期望在同一查询中返回餐馆和酒吧?

如果不是,您可能需要重新考虑让它们从基类型派生。

默认情况下,Mongo_Mapper是打算把两个餐厅和酒吧,一个单一的集合。这可能会妨碍绩效,并使事情在未来难以扩展。

通过一些Mongo_Mapper代码看,它看起来像你也许可以设置此与set_collection_name飞。