我有一个Agency模型,它有属性:from_ageto_age,都是int。我的目标是能够找到一定年龄范围内的所有机构。
注:存储值:1000表示“及以上”的概念。此值存储在to_age中,以便可以像这样指定范围:
服务年龄18and up(从18岁到1000岁)
21岁服务(从21岁到1000岁)
and upfrom_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/

10-13 07:29