查找包含在数字范围内的记录(最小 - 最大)

时间:2014-03-04 10:15:53

标签: ruby-on-rails postgresql activerecord ruby-on-rails-4

Course.rb

min_age: integer
max_age: integer

学生年龄来自params[:age] - 例如15岁,这意味着学生已年满15岁并且他正在寻找涵盖其年龄的课程:

我有课程:

id    min_age   max_age
------------------------
1     5          15
2     10         25
3     10         55
4     20         40

问题:

如何查找min_age和max_age涵盖年龄参数值的所有记录?如果学生说他15岁,他应该看到的课程是:

1,2和3,因为这些是涵盖这个年龄的人。

此外,我需要在搜索模型中使用此功能,当有人搜索课程并且返回的结果是用户(提供这些课程的导师)时,会创建搜索记录。

  def find_courses
    users = User.joins(:courses).where("courses.lesson ILIKE ?", "%#{lesson}%")
    # failed attempt:
    users = users.where('course.min_age >= :age or courses.max_age <= :age', age: age)
  end

感谢您的时间。

根据接受的答案:

Course.where('min_age <= :age AND max_age >= :age', age: 18)

上述sql将要求两个条件都为真以显示记录:

id    min_age   max_age
------------------------
1     5  true  + 15 false = false
2     10 true  + 25 true  =  true
3     10 true  + 55 true  =  true
4     20 false + 40 true  =  false

这将返回id为:2和3

的记录

3 个答案:

答案 0 :(得分:6)

更改大于/小于符号并使用AND

Course.where('min_age <= :age AND max_age >= :age', age: 18)

答案 1 :(得分:1)

你的病情应该是

def find_courses
  user_courses = User.joins(:courses).where('courses.lesson ILIKE ?', "%#{lesson}%")
  user_courses.where(':age >= courses.min_age and :age <= courses.max_age', age: age)
end

答案 2 :(得分:1)

通过以更多Rails方式实现资源,该结构将允许轻松查询:

在routes.rb中:

resources :users, only: :show do
  resources :courses, only: :index
end

在CoursesController #index:

@courses = current_user.available_courses
用户模型中的

def available_courses
  Course.where('min_age <= ? and max_age >= ?', age, age)
end

同样以逻辑和可重用性的方式,我建议给用户一个date_of_birth:datetime属性,并在User模型中设置一个方法来返回它的年龄。