Rails`has_many` association

时间:2017-11-20 19:16:40

标签: sql ruby-on-rails ruby

我是学习Rails的新手,我对协会感到有些困惑。

比如说,我有一个Car,它可以属于OwnerRenterCompany,只能属于 one < / em>他们和OwnerRenterCompany可以有多个Cars

您如何推荐我对这种情况进行建模? Carowner_idrender_id的{​​{1}}表格上应该有三个外键吗?或者为它们中的每一个都有某种连接表,这会产生类似的结果:

| car_id | owner_id |
|--------|----------|
| 1      | 1        |
| 2      | 1        |
| 3      | 1        |

还是有另一种方法可以达到这个目的吗?虽然可以考虑增加更多的家属(更多的租房者,业主等)。

提前致谢。

2 个答案:

答案 0 :(得分:3)

这是您使用多态关联的典型示例。

HTMLTextAreaElement

class Car belongs_to :possessor, polymorphic: true end class Owner has_many :cars, as: :possessor end class Renter has_many :cars, as: :possessor end class Company has_many :cars, as: :possessor end 表格中有两个新字段,carspossessor_type,您可以通过迁移添加它们,并且可以添加其他可能拥有汽车的模型#39;无需向possessor_id

添加更多列

答案 1 :(得分:0)

一种可能的方法:让import unittest from mock import MagicMock, patch # this is the main code over which I have no control def mre_run(): p = PortfolioConfig(n=100) return p.value # the overriding doesn't seem to work yet def spy_decorator(method_to_decorate): mock = MagicMock() def wrapper(self, *args, **kwargs): mock(*args, **kwargs) return method_to_decorate(self, *args, **kwargs) wrapper.mock = mock return wrapper class PortfolioConfig(object): def __init__(self, n): self.value = n+2 class PotatoTest(unittest.TestCase): def test_something(self): wrp = spy_decorator(PortfolioConfig.__init__) with patch.object(PortfolioConfig, '__init__', wrp): result = mre_run() # somehow call it with n=40, the wrapper around PortfolioConfig should change the value. # foo.mock.assert_called_once_with(n=40) self.assertEqual(result, 42) if __name__ == '__main__': unittest.main() 在[{1}},CarOwner上设置外键。

这是一个例子。

Renter
Cars table
id| owner_id | renter_id | company_id |
- |----------|-----------|------------|
1 | 1        | 1         |2           |
2 | 1        | 1         |1           |
3 | 3        | 2         |1           |

The has_many Association