Ruby ActiveModel :: MissingAttributeError

时间:2015-08-26 11:34:28

标签: ruby activerecord heroku

我正在尝试学习我自己的ruby数据库关系。 我与许多“产品”有1个“类别”的关系,我正在尝试将产品添加到远程数据库(heroku服务器)。

TIMESTAMP_create_products.rb

class CreateProducts < ActiveRecord::Migration
    def up
        create_table :products, primary_key: 'product_id' do |p|
            p.index :product_id
            p.string :name
            p.decimal :price
            p.references :categories, index: true
        end
    end

    def down
        drop_table :products
    end
end

TIMETSTAMP_create_categories.rb

class CreateCategories < ActiveRecord::Migration
    def up
        create_table :categories, primary_key: 'category_id' do |c|
      c.index :category_id
            c.string :name
            c.integer :parentId
        end
    end

    def down
        drop_table :categories
    end
end

model.rb

class Products < ActiveRecord::Base
  self.primary_key = "product_id"
    validates :name, presence: true, uniqueness: true
    belongs_to :categories, class_name: "Categories", foreign_key: 'category_id'
end

class Categories < ActiveRecord::Base
  self.primary_key = "category_id"
    validates :name, presence: true, uniqueness: true
    has_many :products, class_name: "Products"
end

每次尝试执行代码时,我都会手动向数据库添加一个类别:

Products.create(name: "name1", price: "1.1", categories: Categories.find(1))

它给了我输出:

  

ActiveModel :: MissingAttributeError无法写入未知属性category_id

这里有什么遗漏?我不明白为什么这不起作用。

1 个答案:

答案 0 :(得分:1)

您可能遇到单数/复数问题。

在迁移中,要创建表格products,您可以使用以下行:

p.references :categories, index: true

这应该会在列表中添加categories_id列。

但是,在Products模型中,外键设置为category_id。因此,当您尝试将某个类别附加到作品时,它会尝试将该类别的ID写入表category_id的列categories,该列不存在。

通过更改产品迁移中的引用名称,一切都可以正常工作:

create_table :products, primary_key: 'product_id' do |p|
  p.index :product_id
  p.string :name
  p.decimal :price
  p.references :category, index: true
end