Thursday, 15 January 2015

inheritance - Rails: ActiveRecord::AssociationTypeMismatch: Superclass expected, got Subclass -



inheritance - Rails: ActiveRecord::AssociationTypeMismatch: Superclass expected, got Subclass -

i trying create class model application has next key features:

inheritance (the class place acts superclass farm , depot). added gem multiple_table_inheritance implement this. relationship place (can have many places)

i using rails 3.2.11 , ruby 1.9.3.p194.

here rough class model of trying implement.

you can find relationship definition in place model:

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

the farm model can seen in following. depot model looks same.

class farm < activerecord::base inherits_from :place end

however, when check relationship model in rails console experience following:

> 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) ...

can tell whether configured relationship correctly? doing wrong? maybe mixed singular , plural names models , associations.

problem identified

i think (a friend of mine , me) found out problem is: whenever database contains relation of 2 places , trying replace pair of ids exact same pair type mismatch error raised. error not pop if replace existing pair another pair.

failing example:

before:

placeconnection ----------------- place_a | place_b ----------------- 1 6 -----------------

action:

> 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) ... working example:

before:

placeconnection ----------------- place_a | place_b ----------------- 3 2 -----------------

action:

> 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">] please note

another thing realized is , time possible extend array of relations follows: farm.places << depot.place. want utilize anyways. nevertheless, assignment problem might bug?!

on lastly line, seek replacing this:

farm.places = [depot]

with this:

farm.places = [depot.place]

the .place method should homecoming superclass instance of place, (which technically placeconnection referencing) instead of subclass instance of depot.

ruby-on-rails inheritance has-many type-mismatch

No comments:

Post a Comment