【问题标题】:How to generate associations between models如何在模型之间生成关联
【发布时间】:2011-11-14 14:03:10
【问题描述】:

我想知道如何在 Rails 中正确进行关联。首先,我创建了一个城市模型和一个组织。现在我想让一个组织有一个城市......这是通过添加has_manyhas_one 关联来完成的。之后我运行rake db:migrate。但不知何故,它不会在我的数据库模型中创建字段citycity_id。我必须自己做吗? Rails 现在不应该在数据库中创建外键约束吗?

要查看它是否有效,我使用rails c 并输入Organisation 答案如下:

=> Organisation(id: integer, name: string, description: string, url: string, created_at: datetime, updated_at: datetime) 

请原谅我的愚蠢问题...我是 Rails 的初学者,一切都还很陌生。

谢谢!


城市:

class City < ActiveRecord::Base
  has_many :organisations
end

组织:

class Organisation < ActiveRecord::Base
  has_one :city
end

创建城市:

class CreateCities < ActiveRecord::Migration
  def change
    create_table :cities do |t|
      t.string :name
      t.string :country

      t.timestamps
    end
  end
end

创建组织:

class CreateOrganisations < ActiveRecord::Migration
  def change
    create_table :organisations do |t|
      t.string :name
      t.string :description
      t.string :url

      t.timestamps
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 activemodel


    【解决方案1】:

    这有几个问题。

    1. 您需要在has_manyhas_one 关联的另一侧指定belongs_to。定义belongs_to 关联的模型是外键所属的位置。

      所以如果一个组织has_one :city,那么一个城市需要belongs_to :organization。或者,如果是城市has_one :organization,则组织需要belongs_to :city

      查看您的设置,您似乎希望在 City 模型中使用 belongs_to 定义。

    2. 迁移不是根据模型定义构建的。相反,它们是从db/migrations 文件夹构建的。运行rails g model 命令(或rails g migration)时会创建迁移。为了获取外键,您需要告诉生成器来创建它。

      rails generate model organization name:string description:string url:string city_id:integer
      

      或者

      rails generate model city name:string description:string url:string organization_id:integer
      

    【讨论】:

    • 只是为了理解。我不能只编辑 db/migrate/...create_cities.rb 然后运行 ​​rake db:migrate?我需要创建一个新的迁移? (对于这种情况,我忘记在生成时为关联建模?)我必须改变两端吗?组织和城市?
    • @Mark 不,如果已应用迁移,则不能。创建一个新的迁移并使用change_table 方法将关联列添加到您的organisations 表中。
    • 您只需要编辑其中一张表。即对应模型定义belongs_to关联的表。
    • 另外,请确保在您的数据库中放置外键约束。最简单的方法是使用 Foreigner gem。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多