【问题标题】:Undefined Method 'Match' when using a :belongs_to association使用 :belongs_to 关联时未定义的方法“匹配”
【发布时间】:2011-10-15 15:28:54
【问题描述】:

我在模型 Brand 上定义了一个 :belongs_to 关联,如下所示:

belongs_to  :loyalty_coupon, :class_name => Coupon, :foreign_key => :loyalty_coupon_id

(从 Brand 到 Coupon 也有 :has_many 关系,但 :belongs_to 关系旨在挑出一个特定的优惠券以引起特别注意。两个关联之间的关系名称和链接字段不同,因此应该没有冲突;我只提到这一点,因为它可以证明是相关的。关系表示为has_many :couponsbelongs_to :brand。)

当我显示Brand.first.loyalty_coupon 时,我得到“nil”(没关系,因为我还没有分配一个)。当我尝试使用命令Brand.first.loyalty_coupon = Coupon.first 分配一个忠诚优惠券时,我收到错误消息:

undefined method `match' for #<Class:0x104036d30>

部分回溯如下:

activerecord (3.0.1) lib/active_record/base.rb:1016:in `method_missing'
activerecord (3.0.1) lib/active_record/base.rb:1180:in `compute_type'
activerecord (3.0.1) lib/active_record/reflection.rb:162:in `send'
activerecord (3.0.1) lib/active_record/reflection.rb:162:in `klass'
activerecord (3.0.1) lib/active_record/reflection.rb:173:in `build_association'

如果我执行Brand.first.build_loyalty_coupon,则会出现相同的错误消息(这并不奇怪,因为它正在做同样的事情)。我在 Coupon 模型中没有 :has_one,但我也尝试了指定 :class_name 和 :foreign_key,当我尝试 Coupon.first.brand_loyalty 时得到了相同的错误和回溯。我想我错过了一些愚蠢的东西,但我看不到它是什么。

【问题讨论】:

  • has_one :loyalty_coupon 等关系的两边都需要 foreign_key 和类名...试试看
  • @jamesw:正确。不幸的是,这并不能解决问题。

标签: ruby-on-rails associations belongs-to


【解决方案1】:

您的:class_name 选项应该是一个字符串,而不是一个类对象。这样 ActiveRecord 就不会尝试加载可能引用“class A”的“class B”,而后者又会引用“class B”等等。

belongs_to  :loyalty_coupon, :class_name => "Coupon"

String 对象具有 match 方法,而 Class 对象没有。

您不需要包含 :foreign_key 选项,因为它是从关联名称推断出来的。

【讨论】:

  • 我知道它必须是简单的。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多