Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Activerecord rails合并多个选择结果并在视图中渲染行_Ruby On Rails_Ruby On Rails 4_Activerecord_Rails Activerecord - Fatal编程技术网

Ruby on rails Activerecord rails合并多个选择结果并在视图中渲染行

Ruby on rails Activerecord rails合并多个选择结果并在视图中渲染行,ruby-on-rails,ruby-on-rails-4,activerecord,rails-activerecord,Ruby On Rails,Ruby On Rails 4,Activerecord,Rails Activerecord,我是Rails的新手,正在为工作面试做测试 几乎达到了预期的结果,下面你可以找到代码 数据示例: Bookings id,room_id,start_date,end_date,number_of_guests 1,1,2015-06-01,2015-06-07,1 2,3,2015-06-01,2015-06-07,2 3,5,2015-06-01,2015-06-07,2 2001,6,2015-06-01,2015-06-07,2 ... Hosts id,name,address 1,

我是Rails的新手,正在为工作面试做测试

几乎达到了预期的结果,下面你可以找到代码

数据示例:

Bookings
id,room_id,start_date,end_date,number_of_guests
1,1,2015-06-01,2015-06-07,1
2,3,2015-06-01,2015-06-07,2
3,5,2015-06-01,2015-06-07,2
2001,6,2015-06-01,2015-06-07,2
...

Hosts
id,name,address
1,Mr Host 1,1 Camden 
2,Mr Host 2,2 Camden Street
3,Mr Host 3,3 Camden Street
4,Mr Host 4,4 Camden Street
...

Rooms
id,host_id,capacity
1,1,2
2,1,2
3,2,2
4,2,2
...
ActiveRecord:

class Room < ActiveRecord::Base
  belongs_to :host
  has_many :bookings
end

class Host < ActiveRecord::Base
  has_many :rooms
end

class Booking < ActiveRecord::Base
  belongs_to :room
end
预期结果:

  host#1: Mr Host 1
  1 Camden Street
  room#1 is available (1 booked, 1 free out of 2 total)
  room#2 is available (0 booked, 2 free out of 2 total)

  host#2: Mr Host 2
  2 Camden Street
  room#4 is available (0 booked, 2 free out of 2 total)

  host#4: Mr Host 4
  4 Camden Street
  room#8 is available (0 booked, 2 free out of 2 total)

  host#5: Mr Host 5
  5 Camden Street
  room#9 is available (1 booked, 1 free out of 2 total)
  room#10 is available (0 booked, 2 free out of 2 total)
我曾考虑使用jquery获得预期的结果,但必须有一种方法通过活动记录或在视图中调用某种助手来实现这一点。提前谢谢

理想情况下,我希望重写查询以检索结果,如下行所示:

  host_id, address, total_rooms, room_id[0], booked[0], capacity[0], ... , room_id[n], booked[n], capacity[n]
因此,对于前两行,我们将有:

  1, 1 Camden Street, 2, 1, 1, 2, 2, 0, 2
  2, 2 Camden Street, 1, 4, 0, 2
相当于前端结果:

主持人#1:主持人1先生 卡姆登街1号 1间可用(1间已预订,共2间,1间免费) 2号房间可用(共2间,0间已预订,2间免费)

主持人#2:主持人2先生 卡姆登街2号
4号房间可用(共2个房间,0个已预订,2个免费)

您不能在SQL级别执行此操作。SQL返回统一的行,您可以按自己喜欢的方式对它们进行排序,但在SQL中对行进行分组不起作用。不能使用它返回一对多关系的部分行;它将返回每行的完整连接记录

如果希望只输出一次顶级记录(本例中为“主机”),然后多次输出关联的记录(“房间”),则需要在前端对结果进行分组:

#...
@rooms = ((@total_rooms - @booked_rooms) + @available_rooms).sort_by(&:id)

# Produce a mapping of hosts to their rooms
@rooms_by_host = @rooms.group_by do |room|
  { id: host_id, address: room.address, name: room.name }
end
将对块返回相同值的元素进行分组。在这种情况下,具有相同的
主机id
地址
名称
的任何文件室都将被分组到返回哈希中的嵌套数组中

在您的视图中,现在将有两个循环:一个外部循环在host=>rooms映射上迭代,另一个内部循环在每个主机的房间上循环:


  • 主持人#-
    • 房间#可用(已预订,全部免费)

如果你担心面试时你是如何表现自己的,那么你应该考虑一下:

  • 不要在Ruby中对x使用
    。循环的惯用方式是
    y.each do | x |
    。在y轴上使用
    表示经验不足
  • 是一个无用的检查,
    @rooms
    是一个数组,它不能是一个伪值。您需要
    如果@rooms.present?
    如果@rooms.any?
  • 不要同时使用
    “{…}”
    。内部
    #{}
    是完全冗余的。你做过的每一个地方

    <%= "#{room.address} "%>
    

也许你可以写下问题是什么?可能会让你对如何回答这个问题有更多的了解。这是一个很有魅力的解决方案,也是最佳实践的提示。
  1, 1 Camden Street, 2, 1, 1, 2, 2, 0, 2
  2, 2 Camden Street, 1, 4, 0, 2
#...
@rooms = ((@total_rooms - @booked_rooms) + @available_rooms).sort_by(&:id)

# Produce a mapping of hosts to their rooms
@rooms_by_host = @rooms.group_by do |room|
  { id: host_id, address: room.address, name: room.name }
end
<%= "#{room.address} "%>
<%= room.address %>
.where("bookings.number_of_guests <> rooms.capacity 
                            AND ? < rooms.capacity 
                            AND ? <= bookings.start_date
                            AND ? <= bookings.end_date", params[:guests], start_date, end_date)
.where('bookings.number_of_guests <> rooms.capacity')
.where('? < rooms.capactiy', params[:guests])
.where('? <= bookings.start_date', start_date)
.where('? <= bookings.end_date', end_date)
    <ul class="rooms">
      <%= render rooms %>
    </ul>
<li>room#<%= room.id %> is available (<%= room.number_of_guests %> booked, <%= room.capacity - room.number_of_guests %> free out of total <%= room.capacity %>)</li>