Арель и полиморфное объединение объединяются - PullRequest
3 голосов
/ 14 марта 2012

У меня есть следующее:

class BaseReseller < ActiveRecord::Base

  set_table_name "resellers"

  acts_as_nested_set

  has_many :merchants, :as => :merchant_owner, :dependent => :destroy
end

class IPSP < BaseReseller
end    

class Agent < BaseReseller
end

class Reseller < BaseReseller
end

class Merchant < ActiveRecord::Base
  belongs_to :merchant_owner, :polymorphic => true
end

class MerchantsController < ApplicationController
  ... 
  def index
    ...
    @merchants = Merchant.joins(:merchant_owner) # breaks!
  end
end

Обратите внимание, как я пытаюсь присоединиться к Продавцу с полиморфным merchant_owner и получаю это: ActiveRecord :: EagerLoadPolymorphicError: Не могу загружать полиморфную ассоциациюmerchant_owner .

@ merchants = Merchant.includes (: merchant_owner) работает изначально, но когда я начинаю перебирать массив @merchants в представлениях, он прерывается с той же ошибкой - похоже, так, потому чтомы работаем с лениво загруженными отношениями и только когда вызывается не-Arel метод, он на самом деле отправляется в БД.

Есть идеи?Поддерживает ли Арель полиморфные ассоциации?Есть обходные пути?Я могу перейти на чистый SQL, но это хреново.

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 сентября 2012

Проблема в пропущенном столбце в одной из таблиц.Rails очень хорошо поддерживает полиморфные ассоциации между иерархиями STI, но будьте осторожны с правильными столбцами для полиморфизма, STI и т. Д.

0 голосов
/ 19 июня 2012

Это может быть слишком много, чтобы спросить у Арела, я не уверен в отличном решении.В вашем случае это выглядит так, как будто все merchant_owners совместно используют одну и ту же таблицу посредников, поэтому имеет смысл захотеть объединиться из полиморфной ассоциации, но в целом полиморфные ассоциации могут относиться к различным моделям (для разных таблиц) в вашей модели данных.,Это может быть довольно уродливым в SQL и, вероятно, довольно медленным в общем случае, поэтому я ожидаю, что EagerLoadPolymorphicError существует.Для вашей ситуации может иметь смысл обойти что-то вроде:

Merchant.joins("INNER JOIN resellers on merchant_owner_id = resellers.id")

Конечно, было бы самым чистым, чтобы это объединение было областью действия для вашей модели, поэтому вы могли бы просто выполнить Merchant.joined_with_owners иSQL отправляется на уровень модели.Однако это не сработает, если у других моделей, не имеющих посредников, будет много продавцов.

Я немного удивлен, что вы видите ту же ошибку с Merchant.includes (: merchant_owner), я не вижу этого с похожими данными, даже когда я получаю доступ к различным атрибутам, но это может быть связано с различнымиРазличия.

Пытаетесь увеличить нагрузку из соображений производительности или из-за того, что у вас есть дополнительные предложения Arel where, которые зависят от атрибутов посредника?Если это из-за производительности, то лучше всего использовать SQL ...

...