Я в основном пытаются сделать что-то вроде этого:ActiveRecord прикован has_many искатель
class A < ActiveRecord::Base
has_many :bs
end
class B < ActiveRecord::Base
belongs_to :a
has_many :cs
end
class C < ActiveRecord::Base
belongs_to :b
has_many :ds
end
class D < ActiveRecord::Base
...
# and so on with class E, F, G, ...
# get all `C` for all `B` of `A` does not work
A.first.bs.cs
--> undefined method `cs' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_B:0xxxxx>
Мой наивный подход заключается в массив патч обезьяне с новой функцией и нам это так:
class Array
def get (m)
self.map{|o| o.send(m)}.delete_if(&:empty?).flatten
end
end
# works:
A.first.bs.get(:cs)
# works too:
A.all.get(:bs).get(:cs)
# works:
A.all.get(:bs).get(:cs).get(:ds).get(:es)
Есть ли какие-то подводные камни, которых я сейчас не вижу? Патч обезьяны Array
с такой функцией пахнет для меня немного - есть ли более чистый подход?
Я просто хочу связать эти has_many
-соединения без лишних хлопот в моем коде. Может быть, у вас уже есть драгоценный камень, которого я еще не нашел?
Может быть 'has_many: CS, через:: bs'? –
Почему вы не проверяете has_many: через опцию –
ясно сказано, что он может идти вниз, а не только на два уровня, поэтому я думаю, что 'through' не работает для перехода от A к E? – Markus