2009-09-08 10 views
0

Есть ли способ напрямую ссылаться (используя рельсы напрямую, не прибегая к большому количеству пользовательских SQL) отношение, которое вложено за полиморфное отношение? В приведенном ниже примере существует ли способ определить отношение has_many в User, которое ссылается на LayerTwo?has_many: сквозные, вложенные полиморфные отношения

Я хотел бы сделать (в пользователе)

has_many :layer_twos, :through => layer_ones 

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

class CreateOwners < ActiveRecord::Migration 
    def self.up 
    create_table :users do |t| 
     t.timestamps 
    end 
    create_table :owners do |t| 
     t.timestamps 
     t.references :owned, :polymorphic => :true 
     t.references :user 
    end  
    create_table :layer_ones do |t| 
    end 
    create_table :layer_twos do |t| 
     t.references :layer_one 
    end 
    end 
end 


class Owner < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :owned, :polymorphic => true 
end 

class User < ActiveRecord::Base 
    has_many :owners 
    has_many :layer_ones, :through => :owners, :source => :owned, :source_type => 'LayerOne' 
end 

class LayerOne < ActiveRecord::Base 
    has_many :owners, :as => :owned 
    has_many :layer_twos 
end 

class LayerTwo < ActiveRecord::Base 
    belongs_to :LayerOne 
end 

ответ

1

Следует отметить, теперь Rails 3.1 имеет вложенные has_many:. Через ассоциации, построенные в an ASCIIcast on this

1

Насколько я знаю, ActiveRecord не поддерживает: через: через отношения. Вы можете обойти это, используя некоторые трюки и взломы, такие как создание VIEW, который переназначает связь в более прямой, что упростит вашу модель ActiveRecord за счет сложности базы данных.

Полиморфные ассоциации являются особенно обычными.

+0

Спасибо просто хотел быть убедиться в том, что с кем-то остальное. –

1

Я не уверен, что его поддержка вложенности через полиморфных asociations, но это может быть стоит проверить на nested_has_many_through плагин, который из README:

... дает возможность определить HAS_MANY :through отношения, пройти через другие has_many:through отношения, возможно через произвольно глубокую иерархию. Это позволяет ассоциации по любому количеству таблиц, которые будут построены, без необходимости прибегать к find_by_sql (который не является подходящим решением, если вам нужно делать жадную загрузку через :include , а).

+0

Да, это сработает. Вам просто нужно быть осторожным, чтобы не слишком гнездиться и не повредить ваше приложение. Я написал сообщение в блоге, показывающее шаг за шагом: http://kconrails.com/2010/01/28/nesting-has_many-through-relationships-in-ruby-on-rails/ –

0

Попробуйте (Rails 3):

class LayerOne < ActiveRecord::Base 
    class << self 
    def layer_twos 
     LayerTwo.where(:layer_one_id => all.map(&:id)) 
    end 
    end 
end 
Смежные вопросы