我是学习Rails的新手,我对协会感到有些困惑。
比如说,我有一个Car
,它可以属于Owner
,Renter
或Company
,只能属于 one < / em>他们和Owner
,Renter
或Company
可以有多个Cars
。
您如何推荐我对这种情况进行建模? Car
,owner_id
和render_id
的{{1}}表格上应该有三个外键吗?或者为它们中的每一个都有某种连接表,这会产生类似的结果:
| car_id | owner_id | |--------|----------| | 1 | 1 | | 2 | 1 | | 3 | 1 |
还是有另一种方法可以达到这个目的吗?虽然可以考虑增加更多的家属(更多的租房者,业主等)。
提前致谢。
答案 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
表格中有两个新字段,cars
和possessor_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}},Car
,Owner
上设置外键。
这是一个例子。
Renter
Cars table id| owner_id | renter_id | company_id | - |----------|-----------|------------| 1 | 1 | 1 |2 | 2 | 1 | 1 |1 | 3 | 3 | 2 |1 |