0

会社エンティティの場所に has_one 関連付けがあります。

class Location < ActiveRecord::Base
  attr_accessible :city, :country, :postal_code, :state
end

class Company < ActiveRecord::Base
  has_one :headquarters, :class_name => "Location"
end

会社エンティティの基礎となるスキーマには、location_id 属性が含まれています。次のように、会社の本社の場所情報にアクセスできるはずです。

Company.find(12345).headquarters

ただし、これにより例外が発生します。

SELECT "locations".* FROM "locations" WHERE "locations"."company_id" = 12345 LIMIT 1
ActiveRecord::StatementInvalid: PGError: ERROR:  column locations.company_id does not exist

なぜこれがこのように振る舞うかについて私は混乱しています。FK は場所ではなく会社にあると予想します (つまり、SELECT * FROM location WHERE locations.id = 12345)。これと同じ方法で定義された他のルックアップがあり、期待どおりに動作します。

注意すべき点がいくつかあります。

  • 場所は会社に属していません。多くのエンティティ タイプが場所を持つことができます
  • アソシエーションの定義をより詳細に/より詳細にしようとしましたが、違いはないようです
  • また、ある時点で「has_one :location」を試して、物事をシンプルに保ちましたが、同じ結果になりました

どんな助けでも大歓迎です。

:)

4

2 に答える 2

0

Company has_one location と言うとき、FK を持つのは Locations テーブル次第であることを意味します。リレーションシップは 1 対 1のリレーションシップであり、あなたの場合、テーブルhas_oneに a を追加することは完全に理にかなっています。company_idLocations

複数のbelongs_to会社を 1 つの場所にリンクできるようになるため、関係 (つまり、場所の所属_会社) はここでは意味がありません。もちろん、それを許可したい場合を除き、モデルのhas_one関係を失い、代わりにモデルに関係Companyを追加します。belongs_toLocation

アップデート

company has_many_and_belongs_to location1 つの会社が多くの場所を持つことができ、1 つの場所が多くの会社を持つことができることを考えると、関係のより良い選択です。

場所テーブル (is_headquarter) に追加の列を追加して、会社の本社を識別します。

于 2013-11-04T05:31:40.800 に答える