0

次の主要な機能を持つアプリケーションのクラス モデルを作成しようとしています。

  • 継承 (クラスはおよびPlaceのスーパークラスとして機能します)。これを実装するために、 gem multiple_table_inheritanceを追加しました。FarmDepot
  • の関係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。これはおそらく、とにかく使用したいものです。それにしても代入問題はバグかも!?

4

1 に答える 1

1

最後の行で、これを置き換えてみてください。

farm.places = [depot]

これとともに:

farm.places = [depot.place]

この.placeメソッドは、のサブクラスインスタンスではなく、のスーパークラスインスタンスPlace(技術的には参照しているもの)を返す必要があります。PlaceConnectionDepot

于 2013-02-08T15:02:08.800 に答える