多对多数据模型拼图

时间:2013-07-29 19:08:48

标签: ruby-on-rails database-design activerecord associations rails-activerecord

鉴于

  1. 3个ActiveRecord型号:

    class Dealer < ActiveRecord::Base
    end
    
    class CarMake < ActiveRecord::Base
      has_many :car_models
    end
    
    class CarModel < ActiveRecord::Base
      belongs_to :car_make
    end
    
  2. CarMakeCarModel应该有额外的外键(使品牌/模型的管理处于独立和独立状态),
  3. 不禁止添加联接表或关联,欢迎使用。
  4. 问题

    我需要经销商为每个分配的car_makes分配一个可用的car_models子集和所需的car_make子集。

    示例

    鉴于此数据:

           car_models            car_makes
    ------------------------   -------------
    id  car_make_id    title   id      title
     1            1     Flex    1       Ford
     2            1   Fiesta    2  Chevrolet
     3            1    Focus    3    Mercury
     4            2   Impala    4     Nissan  
     5            2  Suburan
     6            3    Milan
     7            4   Altima
    

    我想做的是:

    dealer1.his_makes  # => [Ford, Chevrolet, Mercury]
    dealer1.his_models # => [Flex, Fiesta, Impala, Milan]
    
    dealer2.his_makes  # => [Ford, Mercury, Nissan]
    dealer2.his_models # => [Fiesta, Focus, Altima]
    

    我的问题是:
    我应该添加哪些关联/表来实现此目标?

2 个答案:

答案 0 :(得分:1)

添加属于经销商,CarModel和CarMake的库存模型。为了好玩而折腾在“数量”领域。

你可能会认为CarModel不是必需的,但如果它是一个常见的查询,似乎是一个合理的去标准化点。

答案 1 :(得分:0)

经销商和汽车制造商之间的连接表将允许您指定&#34;经销商所需的汽车制造商#34;。如果所有需要的模型都是此表中指定的品牌,那么我将在DealerCarMakes和CarModels之间创建一个连接表,为该经销商指定所需的模型。

虽然您可以使用单个表,但会出现一些问题:

  1. 您需要在查询中找到一个独特的,以检索所需的汽车品牌,这通常表明缺乏正常化。
  2. 能够指定一个理想的汽车制造将取决于有一个理想的汽车模型 - 这可能不是一个问题,但绝对是在没有这种依赖的其他情况下的问题。
  3. 您无法在DealerCarMake级别拥有属性,例如&#34;因为日期&#34;或值范围。