【发布时间】:2011-06-10 23:21:24
【问题描述】:
我正在尝试在 Rails 中建立“虚拟关系”(我称之为 - 不知道是否有真正的术语)。这是我拥有的一个绝对有效的方法:Address belongs_to Business 和 Business has_many Addresses。 地址有一个“类别”列:Mailing 或 Physical。理论上,一家企业可以拥有任意数量的每种类型,但实际上它们只有一种。所以我的模型看起来像这样:
class Address < ActiveRecord::Base
belongs_to :business
end
class Business < ActiveRecord::Base
has_many :addresses
has_one :physical_address, :class_name => 'Address', :conditions => ["category = ?", "Physical"]
has_one :mailing_address, :class_name => 'Address', :conditions => ["category = ?", "Mailing"]
end
因此,我有两个“虚拟”has_one,因此我可以方便地访问其中一个(如 business.physical_address 或 business.mailing_address),而无需执行自己分离它们的工作。
现在我正在尝试做类似的事情,但使用 has_many :through。这是我的新场景。我与连接有一个简单的多对多关系。假设A有很多J,B也有很多J,J 属于 A 和 B。然而,A 也有_many 个B 到J。所以我可以以 a.bs 的身份访问它们。
但是,B 中的条目也有一个“类别”。因此,与上面的 Business/Address 示例一样,我希望在 A 中具有“虚拟”具有单通/多通的关系,因此我不必手动按类别分开B。我尝试过这样的事情(假设 A 正好有一个 B 的 category='Type 1'):
class A < ActiveRecord::Base
has_many :js
has_many :bs, :through => js
has_one :b_type1, :class_name => 'B', :through => :js, :conditions => ["category = ?", "Type 1"]
end
但是,当我在 A 上进行查找时,结果对象中没有 b_type1 属性。
甚至有可能做我想做的事吗?任何帮助表示赞赏。
编辑:我需要将其序列化到 Adobe Flex 前端(使用 RestfulX 框架)。根据this thread,我不能只使用@Andrew 在下面建议的方法,因为如果不进行一些繁重的工作,生成的对象将无法正确序列化。
【问题讨论】:
-
你正在尝试做的有多态关系和单表继承方面,这两个 Rails 都支持。这些主题很广泛,并且在网络上的其他地方广为流传。谷歌搜索一下如何在 Rails 中做这两件事,我想你会找到你想要的。
-
不,这与多态无关。 J 是 A 和 B 之间的连接表,而不是 J 在多态上属于任一 A i> 或 B.
-
对不起,我读到“...and J belongs_to both A and B”表示下午。
标签: ruby-on-rails syntax virtual relationships