Rails:基于孩子和过滤器的过滤父母的属性计算

时间:2017-09-26 12:36:53

标签: ruby-on-rails rails-activerecord

我有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恤适合业主学生。因此,我不希望找到一个学生作为范围方法的输入参数。你知道如何解决这个问题吗?

1 个答案:

答案 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%。