【发布时间】:2017-10-04 20:58:41
【问题描述】:
我正在构建一个预订系统,用户可以在其中搜索开放预订。 Reservation 有一个 :on 范围,用于过滤在给定日期和时间预订的预订。仅 Reservations 上的这个过滤器就可以正常工作,但我还想为给定的seating_capacity(客人)向 Table 模型添加一个过滤器,这样我就可以在给定的一天显示与给定的seating_capacity 匹配的所有预订/时间。任何想法如何添加该过滤器?
型号
class Reservation < ApplicationRecord
belongs_to :user, optional: true
belongs_to :table, optional: true
scope :on, -> (day, time) { where('date = ? AND starts_at <= ? AND ends_at > ?', day, time, time)}
end
class Table < ApplicationRecord
has_many :reservations
has_many :users, through: :reservations
def self.free_on(guests, day, time)
reserved_table_ids = Reservation.on(day, time).pluck('DISTINCT table_id')
reserved_table_ids ? where.not(id: reserved_table_ids) : all
end
def self.reserved_on(guests, day, time)
reserved_table_ids = Reservation.on(day, time).pluck('DISTINCT table_id')
where(id: reserved_table_ids)
end
end
控制器
class TablesController < ApplicationController
def index
@reserved_tables = Table.reserved_on(params[:guests], params[:day], params[:time])
@open_tables = Table.free_on(params[:guests], params[:day], params[:time])
end
end
查看
<%= form_tag(tables_path, :method => "get", id: "table-search-form") do %>
<%= text_field_tag :day, params[:day], class:"datepicker", placeholder: "Select Day" %>
<%= text_field_tag :time, params[:time], class:"timepicker", placeholder: "Select Time" %>
<%= submit_tag "Search", :name => nil %>
<% end %>
架构
create_table "reservations", force: :cascade do |t|
t.integer "user_id"
t.integer "table_id"
t.datetime "date"
t.time "starts_at"
t.time "ends_at"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["table_id"], name: "index_reservations_on_table_id", using: :btree
t.index ["user_id"], name: "index_reservations_on_user_id", using: :btree
end
create_table "tables", force: :cascade do |t|
t.integer "seating_capacity"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
【问题讨论】:
-
您的处理方式有什么问题?更容易知道具体问题是什么。
-
我可以根据
:date和:starts_at和:ends_at时间过滤预订。但我想添加一个范围,根据它们的:seating_capacity过滤表并将其链接到 reservation :on 过滤器。这样,我将只获得在所选日期/时间 >=seating_capacity的表格。
标签: ruby-on-rails rails-activerecord