Rails belongs_to和has_many没有创建主外键关系

时间:2015-06-21 00:51:23

标签: mysql ruby ruby-on-rails-4 model-view-controller model

我正在创建一个主要的 - >在进行数据库设计时,我的列之间的外键关系。我的数据库设计应该是:

用户表:userid(主键),名称

购物清单表:shoppingid(主键),userid(外键)

这是我的迁移文件:

foo.conf

在创建表而不是创建新的迁移文件时,是否有办法创建上述内容?

我使用此命令检查我的关系,但我没有看到任何关系:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.integer :userid, :primary_key
      has_many :shoppinglists, dependent: :destroy

      t.timestamps null: false
    end
  end
end

class CreateShoppinglists < ActiveRecord::Migration
  def change
    create_table :shoppinglists do |t|
      t.integer :shoppingid, :primary_key
      t.belongs_to :userid

      t.timestamps null: false
    end
  end
end

3 个答案:

答案 0 :(得分:3)

由于您的迁移无法应用,您可能认为它包含错误。您似乎不了解迁移的目的及其与模型的区别。此外,您违反了许多惯例,因此它会做一些您不期望的事情。

  • has_manybelongs_to不是迁移&#39;范围。这些方法来自模型,它们添加的只是一些查询方法。它们甚至可以在没有迁移机制的现有数据库上使用,尽管可能很糟糕。
  • Rails已经为每个表添加了主键列id,除非在id: false中使用选项create_table另有说明。因此,添加另一个并违反惯例会自担风险。
  • 滑轨&#39;列命名约定是方法命名的约定:snake_case,而不是likethis。它使用它来适当地复数和单一化给定的术语以通过惯例推断配置。因此,外键列以<ASSOCIATION>_id形式指定,i。即user_id
  • 外键支持最近刚出现in Rails 4.2 only,由于它没有(作为指南声明)与sqlite一起使用,因此Rails默认情况下不会添加这些内容。遵循约定时,您只需要指定受影响的表,Rails将推断其余的。当然,请确保在尝试之前运行Rails 4.2(或更新版本)。在此之前,主外键的概念不属于数据库,而是属于通过has_many和公司生成自己的查询的模型。

答案 1 :(得分:2)

您可以创建类似以下内容的迁移:

rails g migration addShoppingListAssociationToUsers

并且有与迁移内容类似的内容:

class AddShoppingListAssociationToUser < ActiveRecord::Migration
  def change
    add_reference :shoppinglists, :user, index: true, foreign_key: true
  end
end

答案 2 :(得分:1)

我假设您不需要显式创建主键,并且可以使用Rails自动为每个表生成的主键。

# User.rb
has_many :shopping_lists

# ShoppingList.rb
belongs_to :user

# Migration Files
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.timestamps null: false
    end
  end
end

class CreateShoppinglists < ActiveRecord::Migration
  def change
    create_table :shoppinglists do |t|
      t.references :user, index: true
      t.timestamps null: false
    end
  end
end
相关问题