我有一个Agency
模型,它有属性:from_age
和to_age
,都是int。我的目标是能够找到一定年龄范围内的所有机构。
注:存储值:1000表示“及以上”的概念。此值存储在to_age
中,以便可以像这样指定范围:
服务年龄18and up
(从18岁到1000岁)
21岁服务(从21岁到1000岁)
当and up
和from_age
都有正常值时:
服务年龄25-40岁(从25岁到40岁)
服务年龄19-24岁(从19岁到24岁)
所以我试图写一个范围,抓住所有机构在这个年龄范围内。我不认为我的工作范围是预期的:
#modeles/agency.rb
class Agency < ActiveRecord::Base
scope :between_19_24, ->{where("from_age >= ? AND to_age <= ? OR to_age = ?", 19, 24, 1000)}
...
end
所以有了这个查询,我试图获取两个集合
抓住所有
to_age
>=19和from_age
抓住所有to_age
>=19和from_age
=1000的机构(1000代表“向上”的概念)在rails控制台中,当我执行
to_age
时,它运行以下查询:SELECT `agencies`.* FROM `agencies` WHERE (from_age >= 19 AND to_age <= 24 OR to_age = 1000)
我不认为我有这个权利,因为
agencies = Agency.between_19_24
语句应该是这样的,其中or只为最后一部分指定:# I added parenthesis to the part where the or statement should apply
SELECT `agencies`.* FROM `agencies` WHERE (from_age >= 19 AND (to_age <= 24 OR to_age = 1000))
更新
查看所有帮助后我的解决方案:
scope :age_between, -> (lower, upper){ where("(from_age <= ? AND to_age >= ?) OR to_age = ?", lower, upper, -1)}
or
代表“为所有年龄段的人服务”的概念。所以这是说:“抓住所有的机构,至少,服务于期望的年龄范围。如果一个机构不符合这个标准:抓住任何一个服务于所有年龄段的机构。 最佳答案
分离范围不是更容易吗?
scope :older_then, -> (age=18) { where('agencies.from_age > ?' age)) }
scope :younger_then, -> (age=65) { where('agencies.from_age < ?' age)) }
18+ Agency.all.older_then(18)
18-50 18+ Agency.all.older_then(18).younger_then(50)
关于ruby-on-rails - 在示波器Rails中使用OR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33781920/