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
的记录答案 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模型中设置一个方法来返回它的年龄。