2017-09-26 20 views
0

関連するテーブルが2つあり、親オブジェクトの+/-%5のtshirts(子テーブル)の長さ属性に基づいてフィルタを適用したいStudentのheight属性Rails:子と親の属性計算に基づくフィルタリング

残念ながら、親テーブルの名前に未定義のメソッドエラーが発生します。

DBテーブル:

Student 
------ 
id 
name 
height 

Tshirt 
------ 
id 
color 
student_id 
length 

MODELS:

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> 

EDIT: 私は所有者の学生に適したすべてのTシャツを手に入れたいと思います。したがって、私は、1人の学生がスコープメソッドの入力パラメータになることを望んでいません。どのようにしてこの問題を解決できるか考えていますか?

+1

'Tshirt.all.suitablesize'を使う必要はありません。 'Tshirt.suitablesize'はすでにActiveRecordスコープを返すので、' all'はNoOpです。 – ulferts

答えて

2

エラーの説明

それは一瞬の方法ですが、あなたは、Tshirtクラスのstudentを呼び出している:ここでは

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:すべての学生のシャツ 1がデータベースに計算を配置しなければならない個々の生徒に適したシャツを見つけることが望まれていない場合

def self.suitable_size 
joins(:student) 
    .where('tshirts.length < 1.05 * students.height AND tshirts.length > 0.95 * students.height') 
end 

これは、希望シャツの長さが生徒の身長の+/- 5%の生徒に属するすべてのシャツを返却します。

+0

あなたの明確な説明をありがとう。私は所有者の学生に適した適切なすべてのTシャツを手に入れたいです。したがって、私は1人の生徒がスコープメソッドの入力パラメータになることを望んでいません。 – Tolga

+0

@Tolga私は、1人の学生のものだけでなく、すべてのシャツを見つける方法についての回答を更新しました – ulferts

関連する問題