你如何做Rails 3使用where子句选择IN

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)


Mis*_*cha 6

这不会回答你关于"选择IN使用where子句"的问题,但我认为你的整个脚本可以用一行重写joins.这应该与上面的代码段给出相同的结果:

@companies = Company.joins(:clients).where(:clients => {:task_id => params[:id]})
Run Code Online (Sandbox Code Playgroud)


Dan*_*oak 0

我认为问题可能是您有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)