使用a:belongs_to关联时未定义的方法'匹配'

时间:2011-07-29 03:11:38

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

我有一个:在品牌Brand上定义的belongs_to关联如下:

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

(从品牌到优惠券还有一个:has_many关系,但是:belongs_to关系是为了特别关注一个特定的优惠券。两个关联之间的关系名称和链接字段不同,所以应该没有冲突;我只提及它,因为它可能证明是相关的。这种关系表示为has_many :couponsbelongs_to :brand。)

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

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,则会出现相同的错误消息(因为它做同样的事情并不奇怪)。我在优惠券模型中没有:has_one,但我也尝试使用:class_name和:指定foreign_key,并在尝试Coupon.first.brand_loyalty时得到相同的错误和回溯。我想我错过了一些愚蠢的东西,但我看不出它是什么。

1 个答案:

答案 0 :(得分:10)

您的:class_name选项应该是String,而不是Class对象。这样,ActiveRecord不会尝试加载“B类”,它可能引用“A类”,它将引用“B类”,依此类推。依此类推。

belongs_to  :loyalty_coupon, :class_name => "Coupon"

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

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