Rails命名范围不在关联上

时间:2015-11-26 23:15:30

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有以下关联:卖家可以为每个买家定义付款方式。

我希望能够做的就像

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

2 个答案:

答案 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让我朝着正确的方向前进......