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