Ruby on rails “错误”;未知密钥;?
因此,我有一个Rails应用程序,用户可以在其中创建“提交”。现在,我正在尝试为组织添加创建文件夹的功能,在其中提交内容。然而,我似乎遇到了让文件夹模型工作的问题。我得到以下错误:Ruby on rails “错误”;未知密钥;?,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,因此,我有一个Rails应用程序,用户可以在其中创建“提交”。现在,我正在尝试为组织添加创建文件夹的功能,在其中提交内容。然而,我似乎遇到了让文件夹模型工作的问题。我得到以下错误: Unknown key: #<ActiveRecord::Relation:0x007f17cc75d498> 我的猜测是,我可能错误地设置了用户、提交和文件夹之间的关系。以下是我的用户和提交模型: submission.rb: class Submission < ActiveRecord::B
Unknown key: #<ActiveRecord::Relation:0x007f17cc75d498>
我的猜测是,我可能错误地设置了用户、提交和文件夹之间的关系。以下是我的用户和提交模型:
submission.rb:
class Submission < ActiveRecord::Base
belongs_to :folder
belongs_to :user
attr_accessible :content, :title, :user_id
end
你知道会出什么问题吗?这是我第一次遇到这个错误,所以我不确定我犯了什么错误
编辑
以下是用于文件夹和提交的Schema.rb表:
create_table "folders", :force => true do |t|
t.string "title"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "submissions", :force => true do |t|
t.string "title"
t.text "content"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.integer "user_id"
end
编辑2
我的创建文件夹迁移:
class CreateFolders < ActiveRecord::Migration
def change
create_table :folders do |t|
t.string :title
t.timestamps
end
class CreateFolders
结束
结束
这是我的添加文件夹\u id\u到\u提交迁移文件:
class AddFolderIdToSubmissions < ActiveRecord::Migration
def change
end
end
class AddFolderIdToSubmissions
您有一些可能(或可能没有)导致此异常的打字错误:
# app/models/folder.rb
class Folder < ActiveRecord::Base
has_many :submissions, :order => ('updated_at DESC') # note the `:` prior to `order` (denotes a symbol)
end
# app/models/user.rb
class User < ActiveRecord::Base
has_many :folders, :through => :submissions
# or `has_many :folders, through: submissions`
end
确保在运行迁移后重新启动服务器,以便将新内容加载到您的环境中
更新:
要生成将文件夹id显式添加到提交的迁移,请运行以下命令:
rails generate migration AddFolderIdToSubmission folder_id:integer
然后,运行rake db:migrate并重新启动。问题在于您在这一行中使用了简单的单词
order
,而不是:order
:
has_many :submissions, order => ('updated_at DESC')
order
是一种返回ActiveRecord::Relation
,想想文件夹。order(:id).
的方法。您正试图将返回的对象用作散列中的键。这就是您看到的错误。通过讨论确定,问题是提交表没有文件夹id
列。Tom生成了一个空迁移,用于将文件夹\u id
添加到Submissions表,因此得到了一个ActiveRecord::Relation错误
在生成一个新的迁移,将文件夹id添加到Submissions表中后,Tom称错误已经解决
查看更多信息。您是否将
user\u id
和folder\u id
列添加到提交表中?正如您上面所看到的,我确实为此执行了迁移(是的,我随后使用了rake db:migrate)。我需要进入迁移并添加/修改任何代码吗?现在我从Postgres收到错误消息,这使我认为文件夹id仍然没有添加到提交表:PG::error:error:column submissions.folder\u id不存在“folders”上的第1行:…ers“internal JOIN”submissions“。id=”提交人…^:从“文件夹”中选择“文件夹”。*从“文件夹”内部加入“提交”。“id”=“提交”。“文件夹id”中的“提交”。“用户id”=2我是否需要登录到我的Postgres数据库并添加文件夹id列?不,不必这样做。您可以发布您的模式(只是相关的表)以及迁移文件中的实际代码吗?感谢您帮助清理这些文件!没修好,但让我更靠近了。现在我得到了一个Postgres错误,这使我相信文件夹id没有被添加到提交表中。PG::Error:Error:column submissions.folder_id不存在第1行:…ers“文件夹”上的“内部联接”submissions“。id“=”submissio…^:从“文件夹”中选择“文件夹”。*从“文件夹”内部加入“提交”。“id”=“提交”。“文件夹id”中选择“提交”。“用户id”=2不确定我是否需要登录到我的Postgres数据库以进行这些更改,或者我可以通过迁移进行更改。如果可能,您应该通过迁移进行数据库修改。您可以通过从命令行运行rails控制台
并键入Submission
来验证folder\u id
列是否存在。如果文件夹\u id
已正确迁移,它将显示为模型的属性。看起来它没有正确迁移。我将使用迁移文件中的代码更新我的帖子。您是否尝试过按照我的回答运行db:migrate:up
?
class AddFolderIdToSubmissions < ActiveRecord::Migration
def change
end
end
# app/models/folder.rb
class Folder < ActiveRecord::Base
has_many :submissions, :order => ('updated_at DESC') # note the `:` prior to `order` (denotes a symbol)
end
# app/models/user.rb
class User < ActiveRecord::Base
has_many :folders, :through => :submissions
# or `has_many :folders, through: submissions`
end
rake db:migrate:down VERSION=20130710042650
rake db:migrate:up VERSION=20130710042650 # runs 20130710042650_add_folder_id_to_submissions.rb
rails generate migration AddFolderIdToSubmission folder_id:integer
has_many :submissions, order => ('updated_at DESC')