复杂的rails关系来查询

时间:2010-11-12 00:05:19

标签: ruby-on-rails activerecord

我正在使用一个不完全理想的模型结构(即我没有创建它)而且我很难写一个AR查询来获取我想要的数据......

我有以下型号:

class Project < ActiveRecord::Base
  has_many :project_states
  has_many :states, :through => :project_states
end

class State < ActiveRecord::Base
  has_many :forms
  has_many :project_states
  has_many :projects, :through => :project_states
end

class ProjectState < ActiveRecord::Base
  belongs_to :state
  belongs_to :project
end

class Form < ActiveRecord::Base
  belongs_to :state
end

足够简单。伊什。我要做的是获取所有项目的所有表单列表。基本上,假设我在数据库中有两个表单,另外两个表单都有两个表单。我想得到结果:

-----------------------------------------------
project.name  |  state.name  |  form.name

Project 1        Ohio           Form 1
Project 1        California     Form 2
Project 2        Ohio           Form 1
Project 2        California     Form 2

我可以使用以下sql查询轻松完成此操作:

SELECT 
  states.name, forms.name, projects.name 
FROM 
  forms 
LEFT JOIN 
  states ON forms.state_id = states.id 
INNER JOIN 
  project_states ON project_states.state_id = forms.state_id 
LEFT JOIN 
  projects ON projects.id = project_states.project_id;

但我不知道如何通过AR做到这一点。我可以将它作为一个直接的SQL查询,但我需要显示的模型上有方法。我可以通过简单地获取项目,循环它们然后循环遍历每个项目的表单来实现它,但是显示需要是一个可排序的表,这将使得无法对任何表单属性进行排序。

有没有一种简单的方法来实现这个我不见了?例如,如果我做了类似的事情:

Form.joins(:states=> [:projects])

这会为每个表单返回一个结果,而不是每个表单的每个表单的结果。如果我在Projects和Forms之间有直接的关系,那么我就可以轻松获取连接表。但我没有......

1 个答案:

答案 0 :(得分:0)

跟进,我无法真正找到一种方法在rails中执行此操作而不使用find_by_sql,因此我最终为视图创建了一个视图和一个新模型以获取我想要的数据。