2015-07-03 3 views
0

Я определил свои модели следующим образом. Я пытаюсь сделать @user.orders используя has_many. Я определил метод: orders, чтобы показать поведение, которое я хочу.Как установить «имеет много: через» полиморфную ассоциацию

class Location < ActiveRecord::Base 
    belongs_to :locationable, polymorphic: true 
    has_many :orders, ->(location) { where(location.locationable_type == 'User') }, class_name: 'Order', foreign_key: :drop_location_id 
    # but this does not check for type 
    # it produces the SQL: SELECT "orders".* FROM "orders" WHERE "orders"."drop_location_id" = $1 
end 

class Order < ActiveRecord::Base 
    # location is polymorphic, so type of location can be merchant/user 
    belongs_to :pickup_location, class_name: 'Location' 
    belongs_to :drop_location, class_name: 'Location' 
end 

class User < ActiveRecord::Base 
    has_many :locations, as: :locationable 

    # TODO: make it a has_many :orders instead 
    def orders 
    Order.where(drop_location: locations) 
    end 
end 

Используя метод не чувствует, как рельсы пути. Кроме того, я хочу, чтобы он хорошо работал с rails_admin.

+0

Я думаю, вы правы, что с помощью метода не существует пути Rails. Но также определение в has_many-заявлении - это то, чего я никогда не видел, и не пытался. Я рекомендую: http://guides.rubyonrails.org/association_basics.html для разработки лучшей практики для ассоциаций активных записей в Rails. – Elvn

ответ

0

К настоящему времени вы должны были получить сообщение об ошибке, указывающее, что вы не можете использовать has_many через полиморфную ассоциацию. Если вы думаете об этом, это имеет смысл, как ваш ORM (ActiveRecord) формулирует запрос, поскольку объединения будут ужасающими.

+0

«ужасающий», может быть, но детерминированный. Мне просто нужна дополнительная проверка для 'type' (вместе с обычным' id'). Как и в моем методе 'orders':' SELECT "заказы". * FROM "заказывает" WHERE "orders". "Drop_location_id" IN (SELECT "location". "Id" FROM "местоположения" WHERE "местоположения". "Locationable_id "= $ 1 И" местоположения "." Locationable_type "= $ 2)' – vedant1811