#sql #ruby-on-rails #associations
#sql #ruby-on-rails #ассоциации
Вопрос:
У меня есть две модели Company
и InsuredObject
. Company
has_many InsuredObjects
и наоборот belongs_to
. В настоящее время у меня есть работающий поиск InsuredObject
(ов), который возвращает все объекты, содержащие входные данные для поиска, как показано ниже:
# /models/insured_objects.rb
def self.search(search)
query = "%#{search}%"
if search
where("object LIKE ? OR insurance_type LIKE ? OR class_code LIKE ? OR information LIKE ?",
query, query, query, query)
end
end
и:
# /controllers/insured_objects_controller.rb
def index
@insured_objects = InsuredObject.search(params[:search])
end
У каждого Company
есть is_active
атрибут. Я пытаюсь придумать способ поиска того же самого, но возвращаю только InsuredObject
(ы), которые являются их Company
is_active
атрибутом true
. Есть мысли?
Комментарии:
1. Я думаю, вы смотрите на внутреннее соединение
Ответ №1:
Получить все записи InsuredObject
от активных компаний:
InsuredObject.joins(:company).where(companies: {is_active: true})
В joins(:company)
, :company
— это имя ассоциации (в InsuredObject
у вас должно быть belongs_to :company
)
В where(companies: ...
, :companies
это имя таблицы для модели Company
Комментарии:
1. Отлично! Я был так близко. Я использовал «company» вместо «companies». Спасибо за вашу помощь!
2. Еще одна вещь. Как мне затем запросить эти результаты? Я использую
where
для результатов, и это выдает ошибку.3.
SQLite3::SQLException: ambiguous column name: information: SELECT "insured_objects".* FROM "insured_objects" INNER JOIN "companies" ON "companies"."id" = "insured_objects"."company_id" WHERE "companies"."is_active" = ? AND (object LIKE '%auto%' OR insurance_type LIKE '%auto%' OR class_code LIKE '%auto%' OR information LIKE '%auto%')
4. Я сохранил ваше утверждение в переменной, а затем вызвал для него свой первоначальный
search
метод сверху.5. Таким образом, это означает, что у вас есть столбец, вызываемый
object
в обеих таблицах, и когда вы ссылаетесь на этот столбец, неясно, какой из них следует использовать. Чтобы решить эту проблему, обратитесь к столбцу с именем таблицы. например:insured_objects.object LIKE ...