Bob*_*ict 23 ruby-on-rails where-clause ruby-on-rails-3
我正在使用Rails 3,我需要做一个选择,其中记录的主键是在结果先前的选择中.您可以使用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)
Run Code Online (Sandbox Code Playgroud)
ops*_*psb 38
正如其他人所说,我在这种情况下使用了join.使用"in"的语法也很简单,例如
company_ids = [1,2,3,4]
@companies = Company.where("id in (?)", company_ids)
Run Code Online (Sandbox Code Playgroud)
更新
实际上它比现在更简单(我认为rails 3+),你可以做到
company_ids = [1,2,3,4]
@companies = Company.where(id: company_ids)
Run Code Online (Sandbox Code Playgroud)
这不会回答你关于"选择IN使用where子句"的问题,但我认为你的整个脚本可以用一行重写joins
.这应该与上面的代码段给出相同的结果:
@companies = Company.joins(:clients).where(:clients => {:task_id => params[:id]})
Run Code Online (Sandbox Code Playgroud)
我认为问题可能是您有company_list和company_ids。我希望迭代器中的 company_ids 返回类似以下内容的内容:
NameError: undefined local variable or method `company_ids'
Run Code Online (Sandbox Code Playgroud)
我想我可以这样写:
@task = Link.find(params[:id])
clients = Client.where(:task_id => @task.id).select('distinct company_id')
@companies = Company.where(:id => clients.map(&:company_id))
Run Code Online (Sandbox Code Playgroud)