私は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)
他の人が言ったように、この場合は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)
これは「where句を使用してINを選択する」という質問には答えませんが、スクリプト全体を joins
を使用して1行で書き直すことができると思います。これにより、上記のスニペットと同じ結果が得られます。
@companies = Company.joins(:clients).where(:clients => {:task_id => params[:id]})
私はこれがあなたが求めていることをするだろうと信じています:
@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の回答の結合構文の方が読みやすいでしょう。
問題は、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))
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)