Неопределенный метод 'Match' при использовании ассоциации: own_to - PullRequest
2 голосов
/ 29 июля 2011

У меня есть ассоциация: own_to, определенная в модели Brand следующим образом:

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

(Существует также отношение: has_many от бренда к купону, но отношение: own_to предназначено для выделения одного конкретногокупон для особого внимания. Имена отношений и поля связи различны между двумя ассоциациями, поэтому не должно быть никакого конфликта; я упоминаю только об этом, поскольку это может оказаться уместным. Отношения выражаются как has_many :coupons и belongs_to :brand.)

Когда я отображаю Brand.first.loyalty_coupon, я получаю «ноль» (это нормально, потому что я еще не назначил).Когда я пытаюсь назначить loyalty_coupon с помощью команды 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 (не удивительно, потому что он делает то же самое).У меня не было: has_one в модели Coupon, но я также пробовал это с указанными: class_name и: foreign_key, и получал ту же ошибку и трассировку при попытке Coupon.first.brand_loyalty.Я представляю, что мне не хватает чего-то глупого, но я не вижу, что это такое.

1 Ответ

10 голосов
/ 29 июля 2011

Ваш параметр :class_name должен быть строкой, а не объектом класса.Это так, что ActiveRecord не пытается загрузить «класс B», который может ссылаться на «класс A», который будет ссылаться на «класс B» и т. Д. И т. Д.

belongs_to  :loyalty_coupon, :class_name => "Coupon"

String объекты имеютmatch метод, в то время как Class объекты не.

Вам не нужно включать параметр :foreign_key, так как он выводится из имени ассоциации.

...