首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Validates_Overlap Gem多重Scopes相互覆盖

Validates_Overlap Gem多重Scopes相互覆盖
EN

Stack Overflow用户
提问于 2014-10-24 03:48:37
回答 1查看 545关注 0票数 2

我使用的是Validates_Overlap宝石,在这里可以找到:overlap

本质上是我有两个房间可以预订。当同一间房间已经在同一间房间内有确认的预订时,我希望验证能介入。它不应该给我一个错误时,另一个房间已预订,或如果同一房间已预订,但尚未确定。

到目前为止,我的代码如下

代码语言:javascript
复制
validates :start_time, :end_time, 
    :overlap => {
        :exclude_edges => ["starts_at", "ends_at"],
        :scope => { "bookings.studio_id" => proc {|booking| booking.studio_id}} &&  { "bookings.is_confirmed" => proc {|booking| booking.is_confirmed == true}}
        }, on: :update

这将从我的服务器返回以下内容:

代码语言:javascript
复制
Booking Exists (0.4ms)  SELECT  1 AS one FROM "bookings"  WHERE ((bookings.end_time IS NULL OR bookings.end_time >= '2014-10-23 20:00:00.000000') AND (bookings.start_time IS NULL OR bookings.start_time <= '2014-10-24 03:00:00.000000') AND bookings.id != 9 AND bookings.is_confirmed  = 't') LIMIT 1

还有另外两个预订(使用此studio_id),但没有一个被确认。怎么回事?

以下是:studio_id => 2的所有预订

代码语言:javascript
复制
[#<Booking id: 1, studio_id: 2, engineer_id: 5, is_confirmed: false, title: "", allDay: false, created_at: "2014-10-23 19:59:01", updated_at: "2014-10-23 19:59:01", start_time: "2014-10-23 19:00:00", end_time: "2014-10-23 21:00:00", user_id: nil, booker: "Client", client_id: 3>,
 #<Booking id: 8, studio_id: 2, engineer_id: 1, is_confirmed: false, title: "", allDay: false, created_at: "2014-10-24 03:07:34", updated_at: "2014-10-24 03:07:34", start_time: "2014-10-23 19:00:00", end_time: "2014-10-23 22:00:00", user_id: nil, booker: "Pat Sullivan", client_id: nil>,
 #<Booking id: 9, studio_id: 2, engineer_id: 2, is_confirmed: false, title: "", allDay: false, created_at: "2014-10-24 03:26:17", updated_at: "2014-10-24 03:26:17", start_time: "2014-10-23 20:00:00", end_time: "2014-10-24 03:00:00", user_id: nil, booker: "Client", client_id: 4>]

我注意到&&在作用域行中没有注意到studio_id。怎样才能同时注册范围呢?我可以在作用域行内这样做,还是应该创建一个方法?

我也试过一个更简单的

代码语言:javascript
复制
    validates :start_time, :end_time, 
    :overlap => {
        :exclude_edges => ["starts_at", "ends_at"],
        :scope => "is_confirmed" && "studio_id"
        }, on: :update

这做了同样的事情--只使用后面的"studio_id“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-24 06:19:29

我知道,选择的名字让人困惑,对此我很抱歉。

我建议您实现名为:确认的命名范围,并将其作为:query_option参数传递。

我想,应该是这样的:

代码语言:javascript
复制
class Booking < ActiveRecord::Base
  scope :confirmed_scope, -> {confirmed: true}  
  validates :start_time, :end_time, :overlap => {
    :exclude_edges => ["starts_at", "ends_at"],
    :scope => "studio_id",
    :query_options => {:confirmed_scope => nil}
    }, on: :update
end

顺便说一句。如果您使用的是Rails 4.1,请小心,有一个更改的overlap#rails-41-update

简短说明:您传递的内容是:scope选项,它的行为类似于属性。但您可以通过:query_options对其进行扩展。查询链中将调用内部查询选项。因此,在内部,它将被称为如下:

代码语言:javascript
复制
Booking.confirmed_scope.where("starts_at > 18-02-2014 AND ends_at < 20-02-2014 AND studio_id = 1")

现在更清楚了吗?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26541182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档