Rails:从多个表中检索数据而不进行关联

时间:2014-11-24 15:32:27

标签: mysql ruby-on-rails activerecord

我有一个旅行模型,每次旅行都有航班,住宿,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

1 个答案:

答案 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] }。请记住,这是一种非常简单的方法,可以让您在以后重新考虑其架构。