所以我想创建三个模型,Project
,Entry
和User
。 Project
有很多Entries
,而User
有很多Entries
。我使用以下命令搭建了上述三个模型:
rails g scaffold Project title:string
rails g scaffold Entry project:project_id entry_for:user_id created_by:userid \
date:string start_time:string end_time:string total:string type_of_work:string \
on_off_site:string phase:string description:text
rails g scaffold User name:string
我意识到我可能完全搞砸了我为Entry
模型中的其他表手动输入外键的部分。我不知道has_many
belongs_to
在密钥方面自动化了不同模型之间的关系,所以我尝试手动添加外键字段。这是错的吗?
当我尝试运行db:migrate
时,我收到以下错误:
undefined method `user_id' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x007fc1bdf37970>
以下是我的迁移,因为我尝试删除所有外键字段但出现上述错误。
class CreateProjects < ActiveRecord::Migration
def change
create_table :projects do |t|
t.string :name
t.timestamps
end
end
end
class CreateEntries < ActiveRecord::Migration
def change
create_table :entries do |t|
t.string :project
t.string :project_id
t.user_id :entry_for
t.user_id :created_by
t.string :date
t.string :start_time
t.string :end_time
t.string :total
t.string :type_of_work
t.string :on_off_site
t.string :phase
t.text :description
t.timestamps
end
end
end
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.timestamps
end
end
end
class RemoveColumns < ActiveRecord::Migration
def self.up
remove_column :entries, :created_by
remove_column :entries, :entry_for
remove_column :entries, :project_id
end
def self.down
add_column :entries, :created_by, :user_id
add_column :entries, :entry_for , :user_id
add_column :entries, :project_id, :string
end
end
感谢您的帮助!
答案 0 :(得分:1)
在您的迁移中,您可以尝试t.user_id
或t.integer
而不是t.index
。这至少应该让你的迁移运行。
答案 1 :(得分:0)
我将使用t.references entry_for
然后在belongs_to :entry_for, class_name: "User"
模型中编写Entry
作为编写我自己的外键名称的方法。对于project
中的entries
列,我意识到我可以同样写t.references project
。