web-dev-qa-db-ja.com

どのようにRails 3where句を使用してINを選択しますか

私はRails 3を使用しており、レコードの主キーがINである場合に選択を行う必要があります。これは、INを使用したスト​​レートSQLを使用して簡単に行うことができます。明らかに間違った方法で必要なことを実行しました。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)
23
Bob Benedict

他の人が言ったように、この場合はjoinを使用します。 「in」を使用するための構文も非常に単純ですが、たとえば、.

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

更新

実際には、今よりもさらに簡単です(Rails 3+)、あなたはできると思います)

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

これは「where句を使用してINを選択する」という質問には答えませんが、スクリプト全体を joins を使用して1行で書き直すことができると思います。これにより、上記のスニペットと同じ結果が得られます。

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

私はこれがあなたが求めていることをするだろうと信じています:

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

コンソールの最後に.to_sqlを追加すると、SQLを表示できます。

ただし、mischaの回答の結合構文の方が読みやすいでしょう。

1
seph

問題は、company_listとcompany_idsがあることだと思います。イテレータのcompany_idsが次のようなものを返すことを期待します。

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))
0
Dan Croak

Find by idは特定のID(1)、IDのリスト(1、5、6)、またはIDの配列([5、6、10])を受け入れるため、単にfindを使用できます。以下を参照してください。 http://apidock.com/Rails/ActiveRecord/Base/find/class

@companies = Company.find(company_ids)
0
Dana Mut