Опрос полиморфной ассоциации - PullRequest
4 голосов
/ 23 июля 2010

У меня есть такая полиморфная ассоциация -

class Image < ActiveRecord::Base
  has_one :approval, :as => :approvable
end

class Page < ActiveRecord::Base
  has_one :approval, :as => :approvable
end

class Site < ActiveRecord::Base
  has_one :approval, :as => :approvable
end

class Approval < ActiveRecord::Base
  belongs_to :approvable, :polymorphic => true
end

Мне нужно найти разрешения, где approval.apporvable.deleted = false

Я пробовал что-то вроде этого -

@approvals = Approval.find(:all, 
   :include => [:approvable], 
   :conditions => [":approvable.deleted = ?", false ])

Это дает сообщение об ошибке «Не удается загрузить полиморфную ассоциацию: утвержденная»

Как правильно дать условие, чтобы я получил результирующий набор с утверждениями, одобряемый элемент которых не удален?

Спасибо за любую помощь заранее

Ответы [ 4 ]

3 голосов
/ 23 июля 2010

Что вы спрашиваете, с точки зрения SQL, это проецирование данных из разных таблиц для разных строк в наборе результатов.Насколько я знаю, это невозможно.

Так что вам придется довольствоваться:

@approvals = Approval.all.reject{|a| a.approvable.deleted? }
# I assume you have a deleted? method in all the approvables
3 голосов
/ 23 июля 2010

Это невозможно, так как все «утвержденные» находятся в разных таблицах. Вместо этого вам придется получить все утверждения, а затем использовать обычные методы массива.

@approvals = Approval.all.select { |approval| !approval.approvable.deleted? }
1 голос
/ 23 июля 2010

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

С полиморфными отношениями рельсы могут использовать активное извлечение на полисах, но вы не можете присоединиться к ним, потому что опять же отношения не известны, поэтому запрос фактически пересекается с несколькими запросами.

Таким образом, в конце концов, если вам ДЕЙСТВИТЕЛЬНО нужно, перейдите в sql и пересекайте все возможные объединения, которые вы можете сделать со всеми типами допустимых объектов в одном запросе, но вам придется выполнять множество соединений вручную. (вручную, не используя встроенные механизмы рельсов ...)

0 голосов
/ 23 июля 2010

спасибо за ваши ответы. Я был почти уверен, что это невозможно.Я хотел получить еще одно подтверждение, кроме того, что я надеялся на какое-то другое решение, отличное от зацикливания набора результатов, чтобы избежать проблем, связанных с производительностью, в дальнейшем. Хотя в настоящее время оба варианта отклонения / выбора хороши, но в долгосрочной перспективе мне придется выполнять эти объединения SQLвручную.Еще раз спасибо за вашу помощь !!

M

...