Ruby on rails 删除从属记录时,外键不存在
我有两个模型。第一个:Ruby on rails 删除从属记录时,外键不存在,ruby-on-rails,reference,migration,Ruby On Rails,Reference,Migration,我有两个模型。第一个: class Keyword < ActiveRecord::Base has_many :words, dependent: :delete_all end 所以我的问题是,为什么Rails创建了对表的关键字id引用,而不是使用关键字id?以及如何修复它 首先,您需要在您的Word模型中添加一个所属的关系: class Word < ActiveRecord::Base belongs_to :keyword end 如果您真正想要的是多对多关
class Keyword < ActiveRecord::Base
has_many :words, dependent: :delete_all
end
所以我的问题是,为什么Rails创建了对表的
关键字id
引用,而不是使用关键字id
?以及如何修复它 首先,您需要在您的Word
模型中添加一个所属的关系:
class Word < ActiveRecord::Base
belongs_to :keyword
end
如果您真正想要的是多对多关系,则需要添加一个联接表,即keywordswarks
首先,您需要向Word
模型添加一个所属的关系:
class Word < ActiveRecord::Base
belongs_to :keyword
end
如果您真正想要的是多对多关系,则需要添加一个联接表,即keywordswows
存储库中的代码实际上与您发布的迁移代码不同。在回购协议中,您有:
t.belongs_to :keywords
将其更改为:
t.belongs_to :keyword
正如您在问题中发布的,然后重新创建数据库。存储库中的代码实际上与您发布的迁移代码不同。在回购协议中,您有:
t.belongs_to :keywords
将其更改为:
t.belongs_to :keyword
如您在问题中所述,然后重新创建数据库。您需要以下内容:
#app/models/keyword.rb
class Keyword < ActiveRecord::Base
has_many :words
end
#app/models/word.rb
class Word < ActiveRecord::Base
belongs_to :keyword
end
看起来您需要更改单词
表以包含关键字\u id
外键:
$ rails g migration ChangeWordsAddKeywordID
#db/migrate/change_words_add_keyword_id______.rb
class ChangeWordsAddKeywordID
def change
rename_column :words, :keywords_ids, :keyword_id
## OR ##
create_column :words, :keyword_id, :integer
end
end
$ rake db:migrate
您需要以下内容:
#app/models/keyword.rb
class Keyword < ActiveRecord::Base
has_many :words
end
#app/models/word.rb
class Word < ActiveRecord::Base
belongs_to :keyword
end
看起来您需要更改单词
表以包含关键字\u id
外键:
$ rails g migration ChangeWordsAddKeywordID
#db/migrate/change_words_add_keyword_id______.rb
class ChangeWordsAddKeywordID
def change
rename_column :words, :keywords_ids, :keyword_id
## OR ##
create_column :words, :keyword_id, :integer
end
end
$ rake db:migrate
它应该创建关键字\u id
列。您如何尝试删除记录?通过我视图中的链接:您可以显示控制器操作吗?另外,什么是set
-它是Keyword
的一个实例吗?def destroy Keyword.find(params[:id]).destroy flash[:success]=“Keyword set deleted”重定向到keywords\u路径结束
是的,set
是关键字模型的一个实例。似乎可以。在控制台中运行时会得到什么:Word.new.attributes.keys
?它应该创建keyword\u id
列。您如何尝试删除记录?通过我视图中的链接:您可以显示控制器操作吗?另外,什么是set
-它是Keyword
的一个实例吗?def destroy Keyword.find(params[:id]).destroy flash[:success]=“Keyword set deleted”重定向到keywords\u路径结束
是的,set
是关键字模型的一个实例。似乎可以。在控制台中运行时会得到什么:Word.new.attributes.keys
?属于
是引用
方法的别名。迁移代码是正确的。@BroiSatse:谢谢你指出这一点。更正了我的答案。是的,当然rake db:drop&&rake db:setup
属于
是参考
方法的别名。迁移代码是正确的。@BroiSatse:谢谢你指出这一点。更正了我的答案。是的,当然rake-db:drop&&rake-db:setup
Ok,如何重新创建数据库?rake-db:drop&&rake-db:setup
一切都很清楚-rake-db:setup
不运行迁移,而是加载schema.rb
文件的内容。每次运行迁移时都会生成此文件。由于上次运行迁移时迁移不正确,因此架构包含无效的列名,您会继续将其加载回数据库。改为执行rake db:drop
,rake db:create
和rake db:migrate
操作。现在,我在最后一步中出现以下错误:rake db:migrate rake中止!NameError:uninitialized constant CreateKeywords
我已将第一次迁移的类名更改为“CreateKeywords”,现在我有另一个错误:ActiveRecord::StatementInvalid:PG::UndefinedTable:error:relation“words”不存在第5行:其中a.attrelid=““words”“::regclass^
好的,如何重新创建数据库?rake db:drop和&rake db:setup
一切都很清楚-rake db:setup
不运行迁移,而是加载schema.rb
文件的内容。每次运行迁移时都会生成此文件。由于上次运行迁移时迁移不正确,因此架构包含无效的列名,您会继续将其加载回数据库。改为执行rake db:drop
,rake db:create
和rake db:migrate
操作。现在,我在最后一步中出现以下错误:rake db:migrate rake中止!NameError:uninitialized constant CreateKeywords
我已将第一次迁移的类名更改为“CreateKeywords”,现在我有另一个错误:ActiveRecord::StatementInvalid:PG::UndefinedTable:error:relation“words”不存在第5行:其中a.attrelid=““words”“::regclass^
$ rails g migration ChangeWordsAddKeywordID
#db/migrate/change_words_add_keyword_id______.rb
class ChangeWordsAddKeywordID
def change
rename_column :words, :keywords_ids, :keyword_id
## OR ##
create_column :words, :keyword_id, :integer
end
end
$ rake db:migrate