首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将此SQL查询转换为rails (3)语法

如何将此SQL查询转换为rails (3)语法
EN

Stack Overflow用户
提问于 2014-06-04 08:59:22
回答 3查看 119关注 0票数 0

我有一个sql语句,我希望将它“转换”为rails (activerecord)方法调用。

这是我的查询

代码语言:javascript
复制
'SELECT * FROM clients WHERE company_id IN (SELECT company_id FROM companies_projects WHERE project_id= ? )
  • companies_projects是公司和项目的n:n关系的连接表。
  • 客户属于公司(1:n)
  • 项目是一个外部资源,没有has_many公司,所以我不能从这个方向出发。
  • 我想得到属于一个项目的公司的所有客户,所以我可以在索引页面中列出它们。

我的模特

代码语言:javascript
复制
class Client < ActiveRecord::Base
  belongs_to :company
end

class Company < ActiveRecord::Base
  has_many :companies_projects
  has_many :clients
  has_many :projects, :through => :companies_projects
end

我在rails控制台中检查了语句,它可以工作。

我在这个查询中有两个问题。

1. find_by_sql

我试过这种方法

代码语言:javascript
复制
Client.find_by_sql('SELECT * FROM clients WHERE company_id IN (SELECT company_id FROM companies_projects WHERE project_id= ? )',project.id)

但是它抛出一个InvalidStatement异常,MySQL语法错误接近"?“我还尝试将sql和绑定放到一个可以工作的数组sql,bind1中,但是我得到了一个数组,并且需要一个ActiveRecordRelation。

2.其中

我对rails很陌生,无法为这样的查询找出有效的方法链。

有人能给我指明正确的方向吗?我更希望在查询中使用ActiveRecord方法,但我只是不知道嵌套selects使用哪种方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-04 09:02:36

代码语言:javascript
复制
Client.where(company_id: CompanyProject.where(project_id: project.id).pluck(:id))

也可以使用联接。

代码语言:javascript
复制
Client.joins(:company_project).where('companies_projects.project_id = ?', project.id)

但是最好的解决方案是由@提出的。

票数 4
EN

Stack Overflow用户

发布于 2014-06-04 09:05:50

您应该在您的模型之间有以下关联:

代码语言:javascript
复制
class Client < ActiveRecord::Base
  belongs_to :company
end

class Company < ActiveRecord::Base
  has_and_belongs_to_many :projects
  has_many :clients
end

class Project < ActiveRecord::Base
  has_and_belongs_to_many :companies
  has_many :clients, through: :companies
end

然后简单地说:

代码语言:javascript
复制
project.clients
票数 5
EN

Stack Overflow用户

发布于 2014-06-04 09:05:05

考虑到您有一个中间模型CompanyProject,可以通过以下查询实现这一点:

代码语言:javascript
复制
Client.where(:company_id => CompanyProject.where(:project_id => project_id).map(&:company_id) )

[编辑:使company_id成为符号)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24033094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档