0

我正在尝试为我的应用程序创建一个具有以下主要功能的类模型:

  • 继承(类Place充当 and 的超类FarmDepot。我添加了gem multiple_table_inheritance来实现它。
  • a 的关系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) ...

你能告诉我是否正确配置了关系吗?我究竟做错了什么?也许我混合了模型和关联的单数复数名称。


发现问题

我想我们(我和我的一个朋友)发现了问题所在:
每当数据库已经包含两个关系并且您试图用完全相同places的对替换这对 id 时,就会引发类型不匹配错误。如果您用另一对替换现有对,则不会弹出错误。

失败示例:

前:

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

请注意

我们意识到的另一件事是,可以并且一直可以将关系数组扩展如下farm.places << depot.place:无论如何,这可能是我们想要使用的。然而,分配问题可能是一个错误?!

4

1 回答 1

1

在最后一行,尝试替换这个:

farm.places = [depot]

有了这个:

farm.places = [depot.place]

.place方法应该返回 , 的超类实例Place(从技术上讲,它PlaceConnection是引用的)而不是 的子类实例Depot

于 2013-02-08T15:02:08.800 回答