Ошибка полиморфных ассоциаций Rails - PullRequest
1 голос
/ 04 апреля 2011

у меня

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 ' и я не знаю, чего мне не хватает, чтобы провести этот забег. Буду признателен, если кто-нибудь сможет помочь. Спасибо

Ответы [ 2 ]

0 голосов
/ 04 апреля 2011

Я согласен с @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, и вы получите полиморфные ассоциации.

0 голосов
/ 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

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

...