Сложные рельсы отношения к запросу - PullRequest
0 голосов
/ 12 ноября 2010

Я работаю со структурой модели, которая не совсем идеальна (то есть я ее не создавал), и мне трудно написать запрос 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])

Возвращает один результат для каждой формы, а не один результат для каждой формы для каждого проекта. Если бы у меня была прямая связь между проектами и формами, это было бы достаточно просто, так как я мог просто взять таблицу соединений. Но у меня этого нет ...

1 Ответ

0 голосов
/ 20 ноября 2010

Продолжайте, я действительно не мог найти способ сделать это в рельсах, не прибегая к find_by_sql, поэтому я закончил тем, что создал представление и новую модель для получения данных, которые я хотел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...