2015-04-19 2 views
4

Я пытаюсь создать запрос на основе атрибута ассоциированной записи, но я терпеть неудачуRails запросов на основе атрибута ассоциации

Я следующие модели:

class CompanyPay < ActiveRecord::Base 
    has_many :ee_pay 
    has_many :pay, :through => :ee_pay 
end 

class EePay < ActiveRecord::Base 
    belongs_to :company_pay 
    has_many :pay 
end 

class Pay < ActiveRecord::Base 
    belongs_to :ee_pay 
    has_one :company_pay, :through => :ee_pay 
end 

I 'm пытается создать запрос, который возвращает все объекты Pay, где атрибут apply_paye на их ассоциированном CompanyPay равен true.

Я пытаюсь завязать голову, объединять, лямбда и т. Д. Со вчерашнего дня, но я просто смущаю себя больше на сцене.

Запрос Я хочу, чтобы было что-то вроде этого, но я просто не знаю, как выразить это правильно

@records = Pay.where(employee_id: current_employee.id, {|p| p.company_pay.apply_paye == true}).order(:id) 

Может кто-нибудь помочь мне. Можно написать однострочный запрос? Должен ли я использовать соединение? Следует ли использовать лямбда?

Спасибо за взгляд

Edit 1

Я редактировал оригинальный пост, как я дал неверное имя атрибута по ошибке (должно быть apply_paye не taxable).

Попробовал следующий запрос предоставленный fylooi

@records = Pay.joins(:ee_pay => :company_pay).where(:pay => {:employee_id => current_employee.id }, :company_pay => {:apply_paye => true}) 

Но я получаю следующее сообщение об ошибке:

ActiveRecord::StatementInvalid in PayLinesController#update 

    PG::UndefinedTable: ERROR: missing FROM-clause entry for table "pay" LINE 1: ...any_pays"."id" = "ee_pays"."company_pay_id" WHERE "pay"."emp...^: SELECT "pays".* FROM "pays" INNER JOIN "ee_pays" ON "ee_pays"."id" = "pays"."ee_pay_id" INNER JOIN "company_pays" ON "company_pays"."id" = "ee_pays"."company_pay_id" WHERE "pay"."employee_id" = 1 AND "company_pay"."apply_paye" = 't' ORDER BY "pays"."id" ASC 

Edit 2 - Solved

Pluralising имена таблиц в запросе работали, согласно предложению от Давида Олдридж.

Это последний запрос:

@records = Pay.joins(:ee_pay => :company_pay).where(:pays => {:employee_id => current_employee.id }, :company_pays => {:apply_paye => true}) 

Спасибо за вашу помощь

ответ

4

Что-то вроде этого?

Pay.joins(:ee_pay => :company_pay).where(:company_pay => {:taxable => true}) 
+0

Где я могу поместить свой другой параметр запроса 'employee_id: current_employee.id'? –

+1

'.where (: pay => {: employee_id => current_employee.id},: company_pay => {: taxable => true})' – fylooi

+0

Не могу заставить это работать. Я дал неправильное имя атрибута на 'company_pay'. Это называется 'apply_paye'. Ошибка, которую я получаю, это 'PG :: UndefinedTable: ERROR: отсутствует запись FROM-clause для таблицы« платите »LINE 1: ... any_pays». «Id» = «ee_pays». «Company_pay_id» ГДЕ «платите». «emp ... ^: SELECT« платит ». * FROM« платит »INNER JOIN« ee_pays »ON« ee_pays ».« id »=« платит ».« ee_pay_id «INNER JOIN» company_pays «ON» company_pays «.» id "=" ee_pays "." company_pay_id "WHERE" pay "." employee_id "= 1 AND" company_pay "." apply_paye "= 't' ORDER BY" платит "." id "ASC' –

Смежные вопросы