Rails迁移假设没有关系

时间:2012-03-23 14:49:10

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

我有一个带有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表的关系的外键,并引发以下错误:< / p>

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

结尾的列定义约束

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

2 个答案:

答案 0 :(得分:1)

查看模型以及诊断此问题会很有帮助。

然而,话虽如此,我认为如果你在这里使用HABTM关联,那么看看有很多关系可能是个好主意。例如VenueManagement,这将包含您的user_idvenue_id。这样你就可以在有意义的关联上处理额外的属性,比如默认标志。

希望有所帮助。

答案 1 :(得分:1)

由于Rails似乎接受了标记的_id部分并尝试将其链接到表,因此对此的简单解决方法是尝试将其命名为不同,因为惯例表示_id链接到表的字段。

其中一个例子可能是  :default_id_for_venue,或:defualt_venue