我正在尝试为我的应用程序创建一个具有以下主要功能的类模型:
- 继承(类
Place
充当 and 的超类Farm
)Depot
。我添加了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
:无论如何,这可能是我们想要使用的。然而,分配问题可能是一个错误?!