代码之家  ›  专栏  ›  技术社区  ›  roryf

一个模型中的多个一对多关联

  •  0
  • roryf  · 技术社区  · 15 年前

    给定两个模型类, Foo Bar ,我希望foo使用3个不同的属性名,在foo表上使用外键,对单独的bar实例进行3次引用。BAR将单独管理,可以属于许多foo实例。这就解释了一点,很明显“一”是使用错误的关联吗?:

    Foo
       has_one :prop_a, :class_name => "Bar"
       has_one :prop_b, :class_name => "Bar"
       has_one :prop_c, :class_name => "Bar"
    
    Bar
    

    有3种可能的钢筋类型,用a表示 bar_type 字符串字段,foo上的每个引用都对应于其中一个。例如 Foo.prop_a 使用 巴尔型 =“类型A”。如何在Rails中创建这种类型的关联?

    3 回复  |  直到 15 年前
        1
  •  1
  •   BushyMark    15 年前

    你说的对,这里使用了错误的关联。

    在ActiveRecord中,他们模拟 始终使用外键 belongs_to 另一个模型。

    在这个场景中,类foo实际上 归属于 那些道具

    其中一种指定方法是:

    class Foo < ActiveRecord::Base
     belongs_to :prop_a, :class_name => "Bar", :foreign_key => "prop_a_id"
     belongs_to :prop_b, :class_name => "Bar", :foreign_key => "prob_b_id"
     belongs_to :prop_c, :class_name => "Bar", :foreign_key => "prob_c_id"
    end
    

    但这意味着,你必须在foo上有一个标题为“的栏目。 prop_a_id, prop_b_id prop_c_id “它可以存储作为条表主键的整数。

    但是,此解决方案不处理ActiveRecord关联下面列出的问题。对于上面提出的解决方案,您需要了解Rails和单表继承。如果你用谷歌搜索这个,你可以在上面找到很多资源。我个人推荐使用Rails进行敏捷Web开发。在第三版中,你可以在第377页找到它。还有一个很好的关于性传播疾病的初学者写的文章 here

    祝你好运!

        2
  •  1
  •   Will    15 年前

    为什么不使用继承呢?可以创建3个从bar继承的类。您需要做的只是在数据库中有一个类型列。

    class Foo
      has_one :bara
      has_one :barb
      has_one :barc
    end
    
    class BarA < Foo
      belongs_to :foo
    end
    
    class BarB < Foo
      belongs_to :foo
    end
    
    class BarC < Foo
      belongs_to :foo
    end
    

    然后,您的迁移需要有bara-id、barb-id和barc-id列。

    我还没试过,但应该管用。

    one = Foo.new
    two = BarA.new
    three = BarB.new
    four = BarC.new
    one.bara = two
    one.barb = three
    one.barc = four
    one.save
    
    one.bara.foo #=> one
    one.bara.bara = BarA.new
    one.bara.bara.foo #=> two
    
        3
  •  0
  •   inkdeep    15 年前