我目前正在构建一个与酒店预订网站具有类似模型的应用程序。
目前正在考虑处理可用性搜索的方法。
我的模型看起来有点像下面这样:
酒店
_id
姓名
描述
star_rating
地址
纬度
经度
然后我想到了像这样的可用性集合:
可用性
hotel_id(如果可用性是它自己的集合)
日期
房间类型
room_max_occupancy
价格
日期将存储房间可用的一天
room_type 应该是“Twin”“Double”之类的东西
room_max_occupancy 将为 2、3 等...
一个示例查询是:
6 月 1 日至 8 日入住,可供 2 人入住。
对于“搜索结果”,我需要返回 hotel.name、hotel.description、hotel.star_rating。
我正在寻找最有效的方式来存储上面列出的查询类型的数据?
availability集合应该是自己的集合,还是Hotel的子文档?
如果是自己的集合,我是否应该将纬度添加到可用性(连同 hotel_id)以提高搜索效率?
最佳答案
让我们逆向工作,从查询开始。您想要的是一系列日期范围内的可用房间列表。将房间存储为“未预订”以备将来使用是不可行的,因此您需要收集预订信息。查询看起来像:
db.booking.find({date: {$gte: from_date, $lt: to_date}});
这可能会给我们一个房间 ID 列表。
集合:预订
字段:room_id, date
下一个查询是为我们获取符合约束条件的房间 ID 列表的查询。像这样的东西:
db.rooms.find({room_type: "Double", room_max_occupancy: 2});
除了房间已预订的日期外,我们可以获得可用性状态。如果每家酒店的平均房间数很高,那么它不值得用于潜在复制酒店信息的空间,相反我们应该为每个房间提供酒店 ID。然后,您必须汇总一个唯一的酒店列表,以避免重复查询
集合:rooms 字段:room_type, room_max_occupancy, price, hotel_id
最后一个查询是获取酒店信息:
db.hotels.find({id: <ID>}, {'name': 1, 'description': 1, 'star_rating': 1});
集合:酒店 字段:name, description, star_rating, address, lat, lon
如果您确实需要直接访问可用性信息,则必须决定允许预订的日期限制(比如 future 6 个月)。每天,必须运行一个脚本来将新一天的(空白)可用性信息添加到数据库中。您可以将预订集合修改为:
集合:booking 字段:room_id、date、is_available、hotel_id(以及保存预订流程详情的字段)
您的查询现在应该有一个额外的约束:
db.booking.find({is_available: true, date: {$gte: from_date, $lt: to_date}});
您将获得房间 ID 和酒店 ID(一些冗余以跳过额外查询),您可以从中获取酒店的显示详细信息
关于用于酒店预订/房间可用性的 MongoDB 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10970777/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom