Неопределенный метод 'Match' при использовании ассоциации: own_to

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

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

(Существует также отношение: has_many от бренда к купону, но отношение: own_to предназначено для выделения одного конкретного купона, требующего особого внимания. Имена взаимосвязей и поля связи между двумя ассоциациями различаются, поэтому конфликтов быть не должно; I упомяните только это, поскольку это может оказаться актуальным. Отношения выражаются как 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. Я представляю, что упускаю какую-то глупость, но не вижу, что это такое.


person Jack R-G    schedule 29.07.2011    source источник
comment
Вам нужны имена foreign_key и class с обеих сторон отношения для has_one: loyalty_coupon и т. Д. Попробуйте   -  person jamesc    schedule 29.07.2011
comment
@jamesw: Верно. К сожалению, это не решит проблему.   -  person Ryan Bigg    schedule 29.07.2011


Ответы (1)


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

belongs_to  :loyalty_coupon, :class_name => "Coupon"

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

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

person Ryan Bigg    schedule 29.07.2011
comment
Я знал, что это должно быть что-то простое. Большое спасибо за помощь! - person Jack R-G; 30.07.2011