ROR- Невозможно использовать Find в отношениях 1-много - PullRequest
1 голос
/ 25 мая 2009

В Ruby on rails наша модель включает в себя заказы и платежи. Существует 1-много отношений между заказом и платежами. В модели заказов мы указываем: has_many: платежи,: as =>: подлежит оплате И запись платежа имеет payable_id, который установлен в order.id.

В отчете я хочу выбрать все платежи, которые принадлежат заказам данного типа. С помощью: платежей = Payment.find (: все,: условия => условия) и добавление 'payable.type = "a"' к условиям не работает. Похоже, что ActiveRecord не превращает это в правильный оператор соединения (payable_id = order.id и orders.type = 'a'). Я не могу использовать явный SQL здесь, так как условие содержит другие вещи, которые вставляются туда ранее в коде. Спасибо, Раффи Липкин

Ответы [ 3 ]

2 голосов
/ 25 мая 2009

Ваше условие условия неверно.

Вы заявляете, что Order

has_many :payments, :as => :payable

Это говорит мне, что Payment

belongs_to :payable, :polymorphic => true

Это означает, что таблица payments имеет два столбца примечания: payable_id и payable_type. Это также означает, что Payments может применяться не только к Orders, но и к другим моделям (CreditCardBalances, кто знает).

Если вы хотите запросить платежи определенного типа, то есть принадлежащие какому-либо экземпляру определенного класса, вам нужно запросить поле payments.payable_type. Это отлично работает:

Payment.find(:all, :conditions => "payable_type = 'Order'")

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

Не забывайте, что вы можете извлечь это в именованные области, если это проще:

named_scope :on_orders, :conditions => "payable_type = 'Order'"

Что делает его

Payment.on_orders

или динамически:

named_scope :on, lambda { |type| { :conditions => "payable_type = '#{type.to_s}'" } }

Что потом делает

Payment.on(Order) # or Payment.on(CreditCardBalance) or Payment.on("Order")
1 голос
/ 25 мая 2009

Попробуйте включить и ссылаться на фактическое имя идентификатора таблицы в условии, а не на псевдоним ассоциации:

find(:include => "payments", :conditions => ["payment.type = ?", "x"]
0 голосов
/ 25 мая 2009

Вы упоминаете «тип оплаты». Если они довольно статичны, рассматривали ли вы возможность использования наследования одной таблицы (STI) для подкласса различных типов платежей? Тогда Rails сделает всю магию для фильтрации по типу.

* 1003 Е.Г. *

class CreditCardPayment < Payment
...
end

Первоначально даже не нужно демонстрировать другое поведение; однако вы, вероятно, обнаружите, что действительно полезно иметь разные данные и полиморфное поведение в отношении платежей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...