Я работаю со структурой модели, которая не совсем идеальна (то есть я ее не создавал), и мне трудно написать запрос 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
Достаточно просто. Иш. Я пытаюсь получить список всех форм для всех проектов. По сути, скажем, у меня есть две формы в базе данных и 2 проекта, каждый из которых имеет обе формы. Я хотел бы получить результаты:
-----------------------------------------------
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])
Возвращает один результат для каждой формы, а не один результат для каждой формы для каждого проекта. Если бы у меня была прямая связь между проектами и формами, это было бы достаточно просто, так как я мог просто взять таблицу соединений. Но у меня этого нет ...