我正在尝试学习我自己的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
这里有什么遗漏?我不明白为什么这不起作用。
答案 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