我有2个关联表,并希望应用基于tshirts(子表)长度属性的过滤器,该属性是父对象Student's height属性的+/-%5
不幸的是,我收到父表名称的未定义方法错误。
DB TABLES:
Student
------
id
name
height
Tshirt
------
id
color
student_id
length
模型:
class Student < ApplicationRecord
has_many :tshirts
class Tshirt < ApplicationRecord
belongs_to :student
def self.suitablesize
joins(:student).where('length < ? AND length > ?', (1.05*self.student.height),(0.95*self.student.height))
end
控制器:
def index
@tshirts = Tshirt.all.suitablesize
end
错误讯息:
undefined method `student' for #<Class:0xc88cdc0>
修改 我想得到所有合适的T恤,这些T恤适合业主学生。因此,我不希望找到一个学生作为范围方法的输入参数。你知道如何解决这个问题吗?
答案 0 :(得分:2)
错误说明
您在student
课程上呼叫Tshirt
,虽然这是一种即时方法:
joins(:student).where('length < ? AND length > ?', (1.05*self.student.height),(0.95*self.student.height))
此处self.student
是令人不快的部分。
选项1:单个学生的衬衫
如果您想考虑学生的身高,则必须更改范围方法以获取参数:
def self.suitablesize(student)
where('length < ? AND length > ?', (1.05*student.height),(0.95*student.height))
end
然后用你的控制器方法提供学生
def index
@tshirts = Tshirt.suitablesize([SOME STUDENT INSTANCE])
end
我插入[SOME STUDENT INSTANCE]
的部分需要是一个学生实例,例如
def index
@student = Student.find(params[:id])
@tshirts = Tshirt.suitablesize(@student)
end
确切的参数取决于你的应用程序(除了routes之外),所以我只能提供一般指针。
选项2:所有学生的衬衫
如果不希望为个别学生找到合适的衬衫,则必须将计算放入数据库中:
def self.suitable_size
joins(:student)
.where('tshirts.length < 1.05 * students.height AND tshirts.length > 0.95 * students.height')
end
这将返回属于学生的所有衬衫,衬衫长度为学生身高的+/- 5%。