Rails中的多对一双向关系

时间:2012-09-26 08:21:30

标签: ruby-on-rails activerecord

我开始使用Rails,我对这种关系感到困惑。 问题很简单,我有一个代表火车站的Station类和一个Shop类。我只是想让商店有一个车站,代表最近的火车站,所以我想这将是一个多对一的关系。

没有任何ORM,我只需在商店表中添加工作站的外键。在查看了rails关系之后,我最终得到了

class Shop < ActiveRecord::Base
    belongs_to :station
end

class Station < ActiveRecord::Base
    has_many :shop
end

正确地说,商店并不真正属于我发现这种奇怪的电台,所以我想知道这是否是正确的方式,或者我是否感到困惑。

提前谢谢你。

3 个答案:

答案 0 :(得分:1)

belongs_tohas_many未描述所涉及对象的所有权或范围或生命周期。它们只描述对象之间的引用(键)。

此类引用的生命周期可以与:dependent,:autosave等选项相关联。 其他选项如:read_only会降低版本从引用到另一个版本的权限。

所有权是您必须自己定义的概念。例如:论坛中的帖子可以“属于”具有不同权限的不同用户。谁是老板?管理员?最后一位编辑?那个创建帖子的人?对于此类行为,需要额外的定义和机制。我建议你看一下CanCan gem(https://github.com/ryanb/cancan)。

答案 1 :(得分:1)

这是正确的方法。 “属于”只是意味着“有一把外键” - 这并不一定意味着这是一种以实际方式描述这种关系的合理方式。

发布后,代码将无法正常工作 - 您需要复数has_many端;即:

class Station < ActiveRecord::Base
    has_many :shops
end

您可以通过从应用程序文件夹启动rails控制台('rails c')并尝试创建对象来测试实际关系。假设您已经创建了相应的表,您应该可以执行以下操作:

station = Station.create
shop = Shop.create
shop.station = station
station.shops
station.shops.build

...等

答案 2 :(得分:1)

class Station < ActiveRecord::Base
    has_many :shops, :dependent => "nullify"
end

如果您的电台被删除,那么商店将是他们的