我有一个模型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)
-
我很高兴这里有很多问题,但是我将很感谢这两种解决方案以及了解如何使用范围的一般建议。
答案 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。