我有一个sql语句,我希望将它“转换”为rails (activerecord)方法调用。
这是我的查询
'SELECT * FROM clients WHERE company_id IN (SELECT company_id FROM companies_projects WHERE project_id= ? )我的模特
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
我试过这种方法
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使用哪种方法。
发布于 2014-06-04 09:02:36
Client.where(company_id: CompanyProject.where(project_id: project.id).pluck(:id))也可以使用联接。
Client.joins(:company_project).where('companies_projects.project_id = ?', project.id)但是最好的解决方案是由@提出的。
发布于 2014-06-04 09:05:50
您应该在您的模型之间有以下关联:
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然后简单地说:
project.clients发布于 2014-06-04 09:05:05
考虑到您有一个中间模型CompanyProject,可以通过以下查询实现这一点:
Client.where(:company_id => CompanyProject.where(:project_id => project_id).map(&:company_id) )[编辑:使company_id成为符号)
https://stackoverflow.com/questions/24033094
复制相似问题