web-dev-qa-db-ja.com

モデル間の関連付けを生成する方法

Rails正解です。最初にCityモデルとOrganizationを作成します。次に、OrganizationにCityを持たせたいです...これは、 has_manyhas_oneの関連付け。その後、rake db:migrateを実行します。しかし、どういうわけか、データベースモデルにフィールドcityまたはcity_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
20
Mark

これにはいくつか問題があります。

  1. belongs_toまたはhas_manyアソシエーションの反対側でhas_oneを指定する必要があります。 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
    
19
Feech