次の主要な機能を持つアプリケーションのクラス モデルを作成しようとしています。
- 継承 (クラスはおよび
Place
のスーパークラスとして機能します)。これを実装するために、 gem multiple_table_inheritanceを追加しました。Farm
Depot
- の関係
Place
( を多数持つことができますplaces
)
Rails 3.2.11 と Ruby 1.9.3.p194 を使用しています。
これは、私が実装しようとしているものの大まかなクラス モデルです。
Place
モデルでリレーションシップの定義を見つけることができます。
class Place < ActiveRecord::Base
acts_as_superclass
attr_accessible :location, :name, :subtype
has_many :place_connections, foreign_key: :place_a_id, dependent: :destroy
has_many :places, through: :place_connections, source: :place_b
has_many :reverse_place_connections, class_name: :PlaceConnection, \
foreign_key: :place_b_id, dependent: :destroy
end
モデルは以下Farm
で見ることができます。Depot
モデルは同じに見えます。
class Farm < ActiveRecord::Base
inherits_from :place
end
ただし、Rails コンソールでリレーションシップ モデルを確認すると、次のことがわかります。
> farm = Place.first
=> #<Farm place_id: 1, created_at: "2013-02-08 12:19:16", \
updated_at: "2013-02-08 12:19:16">
> depot = Place.last
=> #<Depot place_id: 6, created_at: "2013-02-08 12:19:44", \
updated_at: "2013-02-08 12:19:44">
> farm.places = [depot]
ActiveRecord::AssociationTypeMismatch: Place(#42600420) expected, \
got Depot(#42518820) ...
関係を正しく構成したかどうかわかりますか? 私は何を間違っていますか?モデルと関連の単数形と複数形の名前を混同したのかもしれません。
問題が特定されました
私たち (私の友人と私) は問題が何であるかを発見したと思います:
データベースに既に 2 の関係が含まれていて、ID のペアをまったく同じペアplaces
に置き換えようとすると、型の不一致エラーが発生します。既存のペアを別のペアに置き換えると、エラーは表示されません。
失敗例:
前:
PlaceConnection
-----------------
place_a | place_b
-----------------
1 6
-----------------
アクション:
> farm = Place.first
=> #<Farm place_id: 1, created_at: "2013-02-08 12:19:16", \
updated_at: "2013-02-08 12:19:16">
> depot = Place.last
=> #<Depot place_id: 6, created_at: "2013-02-08 12:19:44", \
updated_at: "2013-02-08 12:19:44">
> farm.places = [depot.place]
ActiveRecord::AssociationTypeMismatch: Place(#42600420) expected, \
got Depot(#42518820) ...
作業例:
前:
PlaceConnection
-----------------
place_a | place_b
-----------------
3 2
-----------------
アクション:
> farm = Place.first
=> #<Farm place_id: 1, created_at: "2013-02-08 12:19:16", \
updated_at: "2013-02-08 12:19:16">
> depot = Place.last
=> #<Depot place_id: 6, created_at: "2013-02-08 12:19:44", \
updated_at: "2013-02-08 12:19:44">
> farm.places = [depot.place]
=> [#<Place id: 6, name: "Some depot", location: "Somewhere", subtype: "Depot", \
created_at: "2013-02-09 12:51:01", updated_at: "2013-02-09 12:51:01">]
ご注意ください
私たちが気付いたもう 1 つのことは、関係の配列を次のように拡張することが可能であり、常に可能であったということですfarm.places << depot.place
。これはおそらく、とにかく使用したいものです。それにしても代入問題はバグかも!?