与Rails和ActiveRecord中的遗留表的非规范化关联

时间:2010-06-15 20:48:39

标签: ruby-on-rails database activerecord normalization foreign-key-relationship

我正在构建一个访问旧系统的Rails应用程序。数据模型包含可以包含一个或多个订阅的客户。订阅始终属于一个且仅一个客户。虽然不需要,但此关联通过连接表“subscribes”表示,该表没有id列:

 Column          |  Type   | Modifiers
-----------------+---------+-----------
 customer_id     | integer | not null
 subscription_id | integer | not null

我将此编码为客户和订阅中的has_and_belongs_to_many声明

class Customer < Activerecord::Base
  has_and_belongs_to_many :subscriptions, :join_table => "subscribes",
    :foreign_key => "customer_id", :association_foreign_key => "subscription_id"
end
class Subscription < Activerecord::Base
  has_and_belongs_to_many :customers, :join_table => "subscribes",
    :foreign_key => "subscription_id", :association_foreign_key => "customer_id"
end

我遇到的问题是,每个订阅只能有一个客户,而不是很多,并且连接表最多只包含一个具有某个customer_id的行。 因此,我不希望订阅的“客户”关联返回一个(最多一个)客户的数组,我真的希望关系“客户”返回客户关联。

有没有办法强制ActiveRecord使这个为1对N关系,即使连接表本身似乎使它成为N对M的关系?

- 托马斯

1 个答案:

答案 0 :(得分:1)

我不知道您是否可以使用ActiveRecord执行此操作,但如果您想要解决此问题,可以在customer模型上定义subscription方法:

class Subscription < Activerecord::Base
   has_and_belongs_to_many :customers, :join_table => "subscribes",
      :foreign_key => "subscription_id",
      :association_foreign_key => "customer_id"

   def customer
      self.customers.first
   end
end