我想知道如何在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

最佳答案

这有几处错误。

  • 您需要在belongs_tohas_many关联的另一端指定has_one。定义belongs_to关联的模型是外键所属的位置。

    因此,如果组织为has_one :city,则城市需要为belongs_to :organization。或者,如果城市为has_one :organization,则组织需要为belongs_to :city

    查看您的设置,看起来您想要belongs_to模型中的City定义。
  • 迁移不是基于模型定义进行的。相反,它们是从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
    
  • 关于ruby-on-rails - 如何在模型之间生成关联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8122711/

    10-12 03:53
    查看更多