Подтвердить что ты не робот

Как вы делаете Rails 3 select IN, используя пункты where

Я использую Rails 3, и мне нужно сделать выбор, где первичный ключ записей - IN в результате предыдущего выбора. Вы можете сделать это легко, используя прямой SQL, используя IN. Вот, очевидно, неверный способ сделать то, что мне нужно. Что такое Rails для этого:

@task = Link.find(params[:id])
clients = Client.where('task_id = ?',@task.id).select('DISTINCT(company_id)')
company_list = []
clients.each do |client|
  company_ids << client.company_id
end
@companies = Company.where(:id => company_ids)
4b9b3361

Ответ 1

Как уже упоминалось, я бы использовал соединение в этом случае. Синтаксис для использования "in" также очень прост, хотя, например,

company_ids = [1,2,3,4]
@companies = Company.where("id in (?)", company_ids)

Обновление

На самом деле это еще проще, чем сейчас (я думаю, рельсы 3+), вы можете сделать

company_ids = [1,2,3,4]
@companies = Company.where(id: company_ids)

Ответ 2

Это не отвечает на ваш вопрос "select IN using where clauses", но я думаю, что весь ваш script можно переписать в одной строке, используя joins. Это должно дать тот же результат, что и ваш фрагмент выше:

@companies = Company.joins(:clients).where(:clients => {:task_id => params[:id]})

Ответ 3

Я считаю, что это сделает то, о чем вы просите:

@task      = Link.find(params[:id])
@companies = Company.where(:id => Client.where(:task_id => @task.id).select('distinct company_id').map(&:company_id))

Вы можете просмотреть sql, нажав на .to_sql в конце консоли.

Синтаксис соединения в неправильном ответе, вероятно, более читабельен.

Ответ 4

Я думаю, что проблема может заключаться в том, что у вас есть company_list и company_ids. Я бы ожидал, что company_ids в iterator вернет что-то вроде:

NameError: undefined local variable or method `company_ids'

Я думаю, что могу написать это как:

@task      = Link.find(params[:id])
clients    = Client.where(:task_id => @task.id).select('distinct company_id')
@companies = Company.where(:id => clients.map(&:company_id))

Ответ 5

Вы можете просто использовать find, поскольку find по id принимает конкретный идентификатор (1), список идентификаторов (1, 5, 6) или массив идентификаторов ([5, 6, 10]), см. http://apidock.com/rails/ActiveRecord/Base/find/class

@companies = Company.find(company_ids)