2015-11-19 3 views
1

я следующие модели определены:Использование Rails STI модель с условиями соединения

class Group < ActiveRecord::Base 
end 

class Person < ActiveRecord::Base 
end 

class Policeman < Person 
end 

class Firefighter < Person 
end 

Внутри Group, я хотел бы получить все группы, которые имеют Policemen, например:

class Group < ActiveRecord::Base 
    has_many :policemen 
    scope :with_policemen, -> { joins(:policemen).uniq } 
end 

это работает как и ожидалось. Теперь, если я хочу, чтобы захватить все группы, которые имеют Policeman, который имеет status: 3, я хотел бы сделать:

class Group < ActiveRecord::Base 
    has_many :policemen 
    scope :with_policemen, -> { joins(:policemen).where(policemen: { status: 3 }).uniq } 
end 

Но, к сожалению, это не работает, так как ActiveRecord строит запрос, используя policemen таблицу, которая, очевидно, не существует , Решением было бы использовать where(people: { status: 3 }) внутри области действия, но мне было интересно, почему ActiveRecord не может помещать правильную таблицу в предложение WHERE, так как она имеет необходимые ассоциации.

+0

Да, это то, где вам просто нужно использовать правильное имя таблицы. Вероятно, это «люди», поэтому «где (люди: {статус: 3})». В журналах вы можете увидеть, что генерирует sql, а затем просмотреть SQL-ошибку, если вам нужно ее настроить. – Swards

+0

Действительно, я намеревался написать «народ». Итак, нет ли способа ActiveRecord для правильного определения правильной таблицы из данной ассоциации? – linkyndy

+0

Я думаю, что единственный вариант - использовать имя таблицы здесь. – Swards

ответ

2

Согласно the docs, формат, ожидаемый для синтаксиса хэша, равен table_name: { column_name: val }.

scope :with_policemen, -> { joins(:policemen).where(people: { status: 3 }).uniq } 

Я согласен с вами - было бы разумнее, если бы синтаксис where и join был схожим. Другая несогласованность - метод group не принимает хэш, только строку или массив.