【问题标题】:Relating two tables with migration in Rails在 Rails 中将两个表与迁移相关联
【发布时间】:2014-02-24 02:28:50
【问题描述】:

目标

users 表与users_photos 表相关联。

问题

我只是不知道该怎么做。

场景

这是我创建users_photos表的命令行:

rails generate migration CreateUsersPhotos image_url:string thumbnail_url:string user:references

它创建索引user_id,但没有任何外键。我听说 Rails 不创建外键,因为 SQLite 不支持该功能。它继续,对吧?也许foreigners 能帮上忙,对吧?

重点是:当我生成迁移并执行rake db:migrate 时,会创建任何模型。换句话说,只是创建了表,我无法与模型交互以向其添加外键。

毕竟,问题是什么?

  1. 当我运行rake db:migrate 时,它不会创建模型。 为什么?
  2. 如何将外键添加到users_photos当用户被删除时,我需要删除user_photo 的条目。

【问题讨论】:

    标签: mysql ruby-on-rails ruby activerecord migrate


    【解决方案1】:
    1. 迁移不会创建模型。运行 rails generate model UserPhotos ... 以创建迁移和模型。否则,您需要手动创建模型。不用担心外键,没有外键,rails 可以很好地处理关联。

    2. 我个人更喜欢在迁移中使用user_id:integer,但你拥有它的方式应该可以工作。如果您希望新模型记录与其父级一起删除,请使用

      # User model
      has_many :user_photos, dependent: :destroy`
      

    【讨论】:

    • 哇!多么简洁的答案,谢谢!因此,在第二个答案中,您引用了一个代码。我应该把它放在哪里?或者更好,我应该如何放置它?
    • 这是标准的关联声明,应该放在你的用户模型中。它还将创建所有 setter 和 reader 来处理一对多关联。
    • 好的,我只需要放在模型的顶部就可以了?没有终端命令、复活节彩蛋等?
    • @GuilhermeOderdenge - 是的,这就是轨道! :) 但是,它会期望您的 user_photos 表具有 user_id 列。此外,保持所有关联都是双向的也是一个好习惯,因此您也应该将belongs_to :user 添加到您的 UserPhoto 模型中。要了解有关关联的更多信息,请参阅@marvelousNinja 提供的链接。
    • 哦,漂亮!谢谢!最后一件事:我的current_user 变量包含users 表中包含的整个用户信息。换句话说,我目前无法访问users_photos。我如何通过current_user 访问它? 我知道,这个问题是关于另一个主题的,但上下文是一样的。
    【解决方案2】:

    迁移和模型。迁移与数据库架构相关:表、行和所有这些东西。因此, rake db:migrate 不会为您创建任何模型。你需要自己做。例如,像这样:

    rails generate model User name:string
    

    它将为您生成适当的模型和迁移(该迁移包含生成“用户”表的代码)。

    外键。是的,你是对的。 Rails 不会创建外键。无论如何,有几种方法可以做到这一点(原始 sql)。 但这些都是不好的选择。你能做的,就是把那种逻辑(关联记录的删除)放在模型里面。这是link to Rails associations guide。您可以通过以下方式声明删除关联记录:

    class User < ActiveRecord::Base
      has_many :photos, dependent: :destroy
    end
    

    【讨论】:

      【解决方案3】:

      你可以像用户有很多帖子一样分配外键,但在帖子中它被保存为 author_id

      class User < ActiveRecord::Base
      has_many :posts, dependent: :destroy, :foreign_key => :author_id
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 2013-10-24
        • 1970-01-01
        • 2015-10-05
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多