我正在尝试在 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也有很多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框架)。根据这个线程,我不能只使用@Andrew 在下面建议的方法,因为如果没有一些繁重的工作,生成的对象将无法正确序列化。