Чтобы сделать то, что вы пытаетесь сделать, не изменяя свои модели, вы должны передать ha sh методу joins следующим образом:
Invitation.joins(department: :organisation).where(organisations: { tag: 'First tag' })
Это говорит ActiveRecord использовать ассоциацию отдела, как определено в модель приглашения и организационная ассоциация из модели Департамента
Чтобы сделать вашу жизнь немного проще, вы можете добавить has_many through
ассоциацию, подобную этой:
class Invitation < ApplicationRecord
belongs_to :department
has_one :organisation, through: :department
end
class Department < ApplicationRecord
belongs_to :organisation
has_many :invitations, inverse_of: :department
end
class Organisation
has_many :departments, inverse_of: :organisation
has_many :invitations, through: :departments
end
Теперь вы можете использовать отношение приглашений в Организации следующим образом:
Invitation.joins(:organisation).where(tag: 'First tag')
Чтобы увидеть sql (например, в консоли), вы можете использовать метод # to_ sql:
Invitation.joins(:organisation).where(tag: 'First tag').to_sql
Наконец, если вы используете область (и вам не нравится ха sh в методе where, в котором вы должны указать таблицу), вы можете использовать «область» и объединить следующим образом:
class Organisation
class << self
def just_tagged
where(tag: 'First tag')
end
end
end
Теперь вы можете ссылаться на область в вашем запросе, используя merge
:
Invitation.joins(:organistion).merge(Organisation.just_tagged)