我有以下关联:卖家可以为每个买家定义付款方式。
我希望能够做的就像
a_seller = Seller.find(34)
a_buyer = Buyer.find(22)
a_buyer.payment_methods_for_seller a_seller
简单,我想:
class SellerBuyerPaymentMethod < ActiveRecord::Base
belongs_to :buyer
belongs_to :seller
end
class Buyer < ActiveRecord::Base
has_many :seller_buyer_payment_methods
scope :payment_methods_for_seller, ->(seller) { joins(:seller_buyer_payment_methods).where(:seller => seller) }
end
但是我收到了错误
NoMethodError:未定义的方法`payment_methods_for_seller&#39;买家:0x000001028e6d88
这有效:
class Buyer < ActiveRecord::Base
has_many :seller_buyer_payment_methods
def payment_methods_for_seller seller
SellerBuyerPaymentMethod.where( :buyer => self, :seller => seller )
end
end
但我觉得我应该可以用范围来做这件事。我在这里缺少一些简单的东西。任何帮助非常感谢...
Rails 4.1,Ruby 1.9.3
答案 0 :(得分:2)
Rails范围只是类方法。内部活动记录将范围转换为类方法。因此,当您定义此范围时:
scope :payment_methods_for_seller, ->(seller) { joins(:seller_buyer_payment_methods).where(:seller => seller) }
您可以将此payment_methods_for_seller
方法视为Buyer
类的类方法。这就是你得到这个错误的原因:
NoMethodError: undefined method `payment_methods_for_seller' for Buyer:0x000001028e6d88
当您在Buyer
类的对象上调用类方法时:
a_buyer.payment_methods_for_seller a_seller
您无法在类的对象上调用范围/类方法。你可以在课堂上调用它:
Buyer.payment_methods_for_seller
第二个示例有效,因为在这种情况下,您将payment_methods_for_seller
方法定义为Buyer
类的实例方法。
希望这可以解决你的困惑。
您可以通过seller_buyer_methods协会获取相关记录,而不是使用范围:
a_buyer.seller_buyer_payment_methods.where( :seller => a_seller )
这是一篇关于Active Record scopes vs class methods的精彩博文,它将为您提供有关此主题的更多有趣信息。
答案 1 :(得分:1)
好的,答案很简单:
a_buyer.seller_buyer_payment_methods.where( :seller => a_seller )
感谢K M Rakibul Islam让我朝着正确的方向前进......