在Rails作用域gem

时间:2019-06-01 11:49:51

标签: ruby-on-rails ruby-on-rails-4 activerecord rubygems ruby-on-rails-5

我有一个模型Coffeeshops,其中包含一个整数值wifi_restrictions。

此字段的整数值表示您可以使用wifi的小时数。

我正在尝试为此设置范围,以便我可以搜索

CoffeeShop.has_wifi_restrictions

...,它将返回所有wifi_restrictions值大于0的咖啡店。

我正在使用rails has_scope gem: https://github.com/plataformatec/has_scope


我已经尝试了所有可以想到的变体来实现模型中的范围,但是此块的语法使我很头疼。

我也都尝试过

has_scope :has_wifi_restrictions, type: :boolean

以及

has_scope :has_wifi_restrictions, type: :integer

我不确定这应该是什么。这里的一个附带问题是,在新的scope方法下,模型中的scope块是否实质上将整数值转换为布尔值。

my_coffee_shop.wifi_restrictions = 1

转换为

my_coffee_shop.has_wifi_restrictions = true

我不确定它是如何工作或如何正确实现的。


我知道在我的模型中,我需要以下内容:

class CoffeeShop < ApplicationRecord
          scope :has_wifi_restrictions, ->(hours) { where(wifi_restrictions: hours.positive?) }
end

在控制器中,我需要类似的东西:

class CoffeeShopsController < ApplicationController
  has_scope :has_wifi_restrictions, type: :boolean
end

当我尝试进行搜索时

CoffeeShop.has_wifi_restrictions

我得到以下信息:

ArgumentError: wrong number of arguments (given 0, expected 1)

-

我很高兴这里有很多问题,但是我将很感谢这两种解决方案以及了解如何使用范围的一般建议。

1 个答案:

答案 0 :(得分:0)

您定义的has_wifi_restrictions范围要求您输入小时数。这似乎与您指定的目标不符(所有具有wifi限制的咖啡店)。后者就像

class CoffeeShop < ApplicationRecord
  scope :has_wifi_restrictions, -> { where('hours > 0') }
end

定义范围与定义查询基本上没有区别(与has_scope gem没有关系)。

要将该范围与has_scope gem一起使用,您需要在控制器中定义一个布尔范围:

class CoffeeShopsController << ApplicationController
  has_scope :has_wifi_restrictions, type: :boolean
end

因此,只有在将“ has_wifi_restrictions = true”作为路由到CoffeeShopsController的查询字符串的一部分时,has_wifi_restrictions范围才会应用于CoffeeShop。