Rails — Поиск объекта на основе значения ассоциации

#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 ...