【问题标题】:Missing 'post_id' column and relationships between users/posts/comments in Rails 3.2Rails 3.2 中缺少“post_id”列和用户/帖子/评论之间的关系
【发布时间】:2012-11-04 00:19:21
【问题描述】:

我仍在熟悉 Rails,并且对我尝试使用 Rails 3.2 解决的问题有疑问。这是我认为我的问题所在的几个文件的链接:

https://gist.github.com/0fe5cf9093b21f4f632f

如果代码真的很糟糕/添加了一些不需要存在的东西,我深表歉意,因为我仍在努力适应一切的工作方式。

我希望在我的网站上发布的每个帖子都有 cmets - 我的逻辑是用户有很多 cmets,我想这些帖子通过用户有很多 cmets。我确实添加了这种关系(尽管它似乎没有做任何特别的事情),而且我觉得我所有的表引用都是正确的(尽管我没有向用户添加任何东西,因为我正在使用设计和感觉我不需要添加任何东西,因为帖子本身就是一个单独的对象)。

到目前为止,我可以展示所有的 cmets,因为我可以创建和保存它们。我至少还保存了user_id 变量,因此它可以了解哪个帐户正在发表评论。我不确定我应该在哪里/何时传递post_id,所以这是最大的问题。我在posts_controller 中尝试过的任何方式(因为理论上我应该能够在加载帖子页面时编辑该属性),我得到一个

undefined method 'post_id'

no post_id column

错误,表示它不存在,尽管据我了解,我已经定义了它。如前所述,user_id 能够被保存的事实让我更加困惑。

如果我显示在我的显示视图中创建的评论的属性,我会得到以下信息:

{
    "id"=>1,
    "content"=>"text here",
    "posted"=>Sat, 03 Nov 2012 20:36:53 UTC +00:00,
    "user_id"=>1,
    "created_at"=>Sat, 03 Nov 2012 20:36:53 UTC +00:00,
    "updated_at"=>Sat, 03 Nov >2012 20:36:53 UTC +00:00
}

没有post_id,虽然我确实将它添加到cmets 的迁移表中。试图在 post 控制器中传递 @post.id (到 show 方法的评论实例,因为它可以在帖子下方使用)会导致质量分配错误。摆弄:class:foreign_key 选项也没有多大作用。根据我所做的研究,其中包括 Rails 自己的一些文档,我认为我不需要 has_many 通过关系,但我不知道我在哪里错过了保存信息所需的内容相应地。

也许这部分是由于我对数据库/模型关系设计缺乏了解,尽管感谢任何帮助。我见过几个类似的问题,但我仍然发现很难将他们的解决方案应用到我自己的特定问题的上下文中。

【问题讨论】:

    标签: ruby-on-rails model has-many belongs-to relationships


    【解决方案1】:

    根据您的帖子,听起来您可能在创建表后将 post_id 添加到迁移中。如果这是真的,请理解修改迁移文件是不好的做法。相反,您应该创建一个新的迁移来“修复”数据库的状态。

    您的帖子和 cmets 的关系似乎设置正确。带有“belongs_to”的模型将具有外键;因此,我希望 cmets 具有“post_id”。

    请查看以下是否适合您:

    1. 从已运行的 cmets 迁移文件中删除“post_id”附加项。
    2. 创建一个新的迁移:rails g migration addPostIdToComments
    3. 在生成的迁移中,在“更改”方法中输入:add_column :comments, :post_id, :integer
    4. 运行您的迁移:“rake db:migrate”

    这应该将 post_id 列添加到您的 cmets 表中。

    如果您陷入绑定并想要完全销毁您的数据库并从头开始重新创建它(它看起来像一个示例应用程序),(请注意这将完全删除数据库)您可以运行:rake db:drop db:create db:migrate

    批量分配问题可能与 Rails 中的新安全选项有关,该选项要求将所有可在数据库中更新的模型属性(列)列入白名单。请参阅 attr_accessible 文档了解白名单属性:http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html

    欢迎来到轨道!希望这会有所帮助!

    【讨论】:

    • 我想我有点傻,数据库擦除(考虑到我所处的阶段,这很好)修复了 post_id 出现的问题。我现在的问题是我不确定在哪里必须将 post_id 的值设置为当前帖子的 id;简单地使用“@comment.post_id = @post.id”似乎并没有起到作用,因为它仍然为零。也许我只需要使用批量分配白名单来解决它,但我觉得应该有更好的解决方案我还没有找到。
    • 显然只是简单地在 comment.rb 中制作 :post_id attr_accessible 解决了这个问题。我必须在显示模型中添加“ params[:id] %>”,这可能不是最好的解决方案,但至少它现在可以工作,直到我想出更好的东西。
    猜你喜欢
    • 2022-11-09
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2014-06-11
    相关资源
    最近更新 更多