Ошибка полиморфных ассоциаций Rails

У меня есть

class Store < ActiveRecord::Base
  belongs_to :user
  has_many :products, :as => :imageable
end

class User < ActiveRecord::Base
  has_one :store
  has_many :products, :as => imageable
end

class Product < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true
end

и я мигрировал:

class AddImageableToProducts < ActiveRecord::Migration
  def self.up
    change_table :products do |t|
      t.references :imageable, :polymorphic => true
    end
  end

  def self.down
    remove_column :products, :imageable
  end
end

Когда я пытаюсь запустить свое приложение, я получаю: неопределенная локальная переменная или метод `imageable', и я не знаю, чего мне не хватает для этого запуска. Я признателен, если кто-то может помочь. Спасибо


person railslearner    schedule 04.04.2011    source источник


Ответы (2)


Я согласен с @kishie, поскольку продукт является полиморфным, он может быть связан с более чем одной моделью, вам нужно иметь два столбца в таблице продуктов, чтобы определить модель, с которой связан этот экземпляр. imageable_id и imageable_type.

Я уверен, что у вас есть это в папке lib.

lib/imageable.rb
module Imageable
    def self.included(base)
        base.class_eval do
            has_many :products, :as => imageable
        end
    end
end

Поскольку я предполагаю, что вы используете Rails 3, содержимое папки lib не загружается автоматически. Вы должны иметь это в своем application.rb

config.autoload_paths += %W(#{config.root}/lib)

Добавьте поля, перенесите, отредактируйте application.rb, и вы получите полиморфные ассоциации.

person Syed Aslam    schedule 04.04.2011
comment
Спасибо, Сэм. Я использую Rails 3 и не знал, что должен быть отдельный файл lib или иметь config.autoload_paths в application.rb. Я читал о полиморфных ассоциациях на rubyonrails.org, и там ничего об этом не упоминалось. Вы знаете, где я могу прочитать о том, что вы мне предложили? Огромное спасибо - person railslearner; 04.04.2011
comment
Я пробовал все, что вы упомянули, и я все еще получаю ту же ошибку. Неужели полиморфная ассоциация должна быть такой сложной в реализации? - person railslearner; 04.04.2011

На мой взгляд, в вашем случае вы должны использовать что-то вроде «productable». Но если вы все равно хотите использовать это имя, вы должны добавить в таблицу продуктов следующие поля:

imageable_id как целое число и imageable_type как строка.

И еще одно, в вашей миграции вы можете использовать это

def self.up
 add_column :table_name, :field_name, :field_type
end

def self.down
 remove_column :table_name, :field_name
end

вместо вашего кода =)

person Sergey Kishenin    schedule 04.04.2011
comment
Спасибо Киши. Я попытался сделать это с productable и перешел на imageable, просто чтобы посмотреть, будет ли это иметь значение. Поскольку я новичок в рельсах, я просто стараюсь оставаться как можно ближе к руководству :) Спасибо за предложение. - person railslearner; 04.04.2011