我有一个旅行模型,每次旅行都有航班,住宿,CarRental,活动等等。每个模型都有自己的字段,但所有模型都有一个"开始日期"和/或"结束日期"。我想创建一个仪表板并显示一个行程。
查询数据库的最佳解决方案是什么,结果如下:
Row Model Id Date Type
#1 Flight 2 2014-12-01 Flight
#2 Lodging 54 2014-12-02 Check-in
#3 Lodging 54 2014-12-08 Check-out
#4 Flight 3 2014-12-10 Flight
我想得到这个结果并创建一个行程:
result.each do |itinerary_item|
item = @trip.send(itinerary_item.Model).find(itinerary_item.id)
** do things with the item in a view model
end
但我的思维方式似乎并不聪明。我必须订购行程日期!
编辑1: 我正在尝试做类似的事情:
@trip = Trip.find(1)
itinerary = {}
itinerary['items'] = []
@trip.flights.each do |flight|
itinerary['items'] << [flight.class.name, flight.id, flight.departure_date]
end
@trip.lodging.each do |ld|
itinerary['items'] << [ld.class.name, ld.id, ld.check_in_date]
itinerary['items'] << [ld.class.name, ld.id, ld.check_out_date]
end
... and so on with all the related models. and then
result = itinerary['items'].sort_by {|c, i, date| date }
... and then
result.each do |item|
... do the magic querying the database again =(
end
答案 0 :(得分:1)
一种非常简单的方法是在Trip
模型中添加一个返回所有旅行部分的方法。
喜欢这个:
def parts
(flights + lodgings + rentals + activities).to_a
end
然后在您的视图中迭代此parts
数组:
@trip.parts.each do |part|
# your code here
end
<强>更新强>
在这种情况下,您可以创建一个散列,其中包含您想要的每个部分的所有信息:
def parts
flights_info = flights.map { |flight| { :model => "Flight", :id => flight.id, :date => flight.date, :type => "flight" } }
lodgings_info = lodgings.map { |lodging| { :model => "Lodging, :id => lodging.id, :date => lodging.date, :type => lodging.type } }
...
items = (flights_info + lodgings_info + ...).to_a
items.sort_by { |item| item[:date] }.reverse
end
然后在您的视图中使用它:@trip.parts.each { |part| part[:model] }
。请记住,这是一种非常简单的方法,可以让您在以后重新考虑其架构。