1

我从 Rails 开始,我对这些关系有点困惑。问题很简单,我有一个Station代表火车站的班级和一个Shop班级。我只是希望商店有一个车站,代表最近的火车站,所以我想这将是一个多对一的关系。

如果没有任何 ORM,我只需在 shop 表中添加站的外键。在查找了rails关系之后,我最终得到了

class Shop < ActiveRecord::Base
    belongs_to :station
end

class Station < ActiveRecord::Base
    has_many :shop
end

正确地说,这家商店并不真正属于我觉得这种奇怪的车站,所以我想知道这是否是正确的前进方式,或者我是否感到困惑。

先感谢您。

4

3 回答 3

1

belongs_to并且has_many不描述它们相关对象的所有权或范围或生命周期。它们只是描述对象之间的引用(键)。

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

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

于 2012-09-26T09:40:49.863 回答
1

这是进行的正确方法。“属于”仅仅意味着“有一个外键”——这并不一定意味着这是一种描述实际关系的明智方式。

如发布的那样,代码将无法正常工作-您需要将 has_many 方复数;IE:

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

...ETC

于 2012-09-26T10:02:13.307 回答
1
class Station < ActiveRecord::Base
    has_many :shops, :dependent => "nullify"
end

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

于 2012-09-26T11:19:15.967 回答