【问题标题】:Rails migration assumes a relationship where there is noneRails 迁移假定没有关系
【发布时间】:2012-03-23 14:49:09
【问题描述】:

我有一个带有 User 模型和 Venue 模型的 Rails 3.1 应用程序。这两种模型具有 HABTM 关系 - 一个用户可能管理多个场所,一个场所可能由多个用户管理。

我希望用户能够选择默认地点,因此我尝试通过以下迁移将default_venue_id 属性添加到User

class AddDefaultVenueIdToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :default_venue_id, :integer
  end

  def self.down
    remove_column :users, :default_venue_id
  end
end

问题是,当我对我的 PostgreSQL 数据库运行迁移时,它假设 default_venue_id 是与不存在的 default_venues 表的关系的外键并引发以下错误:

PGError: ERROR:  relation "default_venues" does not exist
: ALTER TABLE "users" ADD FOREIGN KEY ("default_venue_id") REFERENCES "default_venues" ("id")

我应该做些什么来告诉数据库我不是在尝试创建关系,还是我这样做的方式不对?

编辑:我刚刚意识到另一位参与该项目的开发人员添加了schema_plus gem,它自动为以_id 结尾的列定义约束

这解释了为什么我以前从未遇到过这种行为!

【问题讨论】:

    标签: ruby-on-rails database ruby-on-rails-3 postgresql rails-migrations


    【解决方案1】:

    查看模型也有助于诊断此问题。

    不过话虽如此,我认为如果您在此处使用HABTM 关联,那么查看具有多个直通关系可能是个好主意。例如:VenueManagement 将包含您的 user_idvenue_id。这样你就可以在有意义的地方处理关联的额外属性,比如默认标志。

    希望对您有所帮助。

    【讨论】:

    • 你说得对,在这种情况下有很多通过会更合适。谢谢!
    【解决方案2】:

    由于 Rails 似乎选择了标记的 _id 部分并尝试将其链接到表,因此解决此问题的简单方法是尝试以不同的方式命名它,因为按照惯例,带有 _id 的字段链接到表。

    一个例子可能是 :default_id_for_venue,或者只是:defualt_venue

    【讨论】:

    • 谢谢,我怀疑这可能与 _id 有关,但我以前从未遇到过。
    • 有没有办法告诉 Rails 不要链接到表?一个不那么容易的解决方案?例如owner_id 始终是用户 ID。
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2012-11-18
    • 2012-10-01
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多