Этот вид соответствует моему исходному вопросу о has_many :through
с условиями, но я обнаружил еще одну проблему.
Учитывая этот класс:
class Contact < AR
has_many :group_contacts
has_many :groups, :through => :group_contacts, :conditions => {:published => true}
has_many :anonymous_groups, :through => :group_contacts, :source => :group, :conditions => {:anonymous => true}
end
Моя проблема возникает, когда я пытаюсь включить anonymous_groups
с contacts
:
Contact.includes(:anonymous_groups)
ActiveRecord::StatementInvalid: PGError: ERROR: отсутствует запись предложения FROM для таблицы «контакты»
Причина этого в том, что сгенерированный sql неверен. Это что-то вроде:
SELECT "group_contacts"."id" AS t0_r0 ... "groups"."anonymous" AS t1_r5 ... LEFT OUTER JOIN "groups" ON "groups"."id" = "group_contacts"."group_id" WHERE ("group_contacts".contact_id IN (...) AND ("contacts"."anonymous" = 'true'))
Перефразировано конечно, но посмотрите на конечное состояние. Он ставит анонимное условие на contacts
, а не groups
Теперь мы можем исправить эту ошибку запроса (которая, я уверен, является ошибкой), но выполнив что-то вроде:
has_many :anonymous_groups, :through => :group_challenges, :source => :group, :conditions => { :groups => {:anonymous => :true} }
Это ставит условие на правильную таблицу в sql, но когда я пытаюсь создать анонимную группу, я получаю это:
contact.anonymous_groups.build
ActiveRecord::UnknownAttributeError: неизвестный атрибут: groups.anonymous
Таким образом, он работает для запросов, но не для построения. Я совершенно уверен, что это ошибка, но мне интересно, сталкивался ли кто-нибудь с этим или есть обходной путь.
:conditions => {'groups.anonymous' => true}
и это не удалось по той же причине. Но делать это в прямой строке работает. странный. Огромное спасибо 23.12.2011