Rails - как заставить ассоциации использовать имя таблицы псевдонимов
p = Patient.find(30)
p.patient_problems
Приведенный выше код генерирует следующий запрос
SELECT `patient_problem`.* FROM `patient_problem` WHERE `patient_problem`.`patient_id` = 30 AND (`patient_problem`.`record_status_id` = 1)
Но есть ли способ назначить/использовать псевдоним table_name, например
p.patient_problems(:alias=>'p1') # just for Ex.. This code will not work
p.patient_problems(:alias=>'p2') # just for Ex.. This code will not work
Таким образом, он будет генерировать следующие запросы
SELECT `p1`.* FROM `patient_problem` AS `p1` WHERE `p1`.`patient_id` = 30 AND (`p1`.`record_status_id` = 1)
SELECT `p2`.* FROM `patient_problem` AS `p2` WHERE `p2`.`patient_id` = 30 AND (`p2`.`record_status_id` = 1)
Дополнительная информация
Моя проблема в том, что я пытаюсь использовать объединения
p.patient_problems (: все,: присоединяется = > присоединяется)
Я получаю эту ошибку
ActionView::Template::Error (Mysql2::Error: Not unique table/alias: 'patient_problem': SELECT `patient_problem`.* FROM `patient_problem` LEFT OUTER JOIN party on party.id = patient_problem.patient_id
LEFT OUTER JOIN party_identifier on party.id = party_identifier.party_id
LEFT OUTER JOIN blood_type on blood_type.id = party.blood_type_id
LEFT OUTER JOIN education_level on education_level.id = party.education_level_id
LEFT OUTER JOIN religion on religion.id = party.religion_id
LEFT OUTER JOIN living_arrangement on living_arrangement.id = party.living_arrangement_id
LEFT OUTER JOIN patient_problem patient_problem on patient_problem.patient_id = party.id and patient_problem.record_status_id = 1
left join (select user_type,username,user_id,auditable_id from (select MAX(id) id from audits where audits.auditable_type = 'PatientProblem' and user_type is not null group by auditable_id ) t inner join audits v on v.id=t.id ) entered_by1 on entered_by1.auditable_id = patient_problem.id
left outer join user user1 on entered_by1.user_id = user1.id
left outer join party as party_user1 on party_user1.id = user1.person_id
LEFT OUTER JOIN patient_patient_search patient_patient_search1 on patient_patient_search1.patient_id = party.id
left join search search1 on patient_patient_search1.patient_search_id = search1.id
and patient_patient_search1.patient_search_id = '75' WHERE `patient_problem`.`patient_id` = 45 AND (`patient_problem`.`record_status_id` = 1) AND ( (patient_problem.occurrence_date > '2013-01-01 00:00:00' and patient_problem.occurrence_date < '2013-06-30 23:59:59' and patient_problem.patient_problem_status_id in (5) and patient_problem.code is not null and patient_problem.code in ('10725009') ) and ( patient_patient_search1.patient_search_id in (75.0) ) ))
Конечно, я мог бы сделать некоторые манипуляции с строками в запросе сгенерированных объединений и задать псевдоним для параметра_пары. Но я думал, что установка псевдонимов для ассоциаций будет более чистым, поскольку сгенерированный запрос объединения непредсказуем (в моем сценарии)
Ответы
Ответ 1
Я не уверен, что такое переменная joins
и как она была построена. Для таблиц псевдонимов в объединении создайте свой запрос, например
Рельсы 3
PatientProblem.joins("as p1 OUTER JOIN patient_problem as p2 on ...")
или
PatientProblem.find(:all, :joins => "as p1 OUTER JOIN patient_problem as p2 ON ...")
Ответ 2
вы можете сделать для этого методы singleton и написать запрос один раз и использовать может время, например
def self.p1
#your active record query here.
end
и назовите
PatientProblem.p1
Ответ 3
Обновление
Вы можете просто изменить имя таблицы в своем коде:
Patient.table_name="p2"
Я не уверен, что это сломает что-нибудь еще, хотя... так что удачи!
Ориниальный ответ
Одним из решений может быть определение отдельной модели для каждого типа проблемы patient_problem, а затем сделать что-то вроде этого:
class PatientProblem2 < ActiveRecord::Base
self.set_table_name "p2"
...
end
Другим решением может быть использование интерфейса запросов ActiveRecord, который позволит обеспечить значительную гибкость запросов:
http://guides.rubyonrails.org/active_record_querying.html
Возможно, вы можете быть более конкретным в проблеме природы, которую вы пытаетесь решить.