Rails 4路由具有单表继承和自引用

时间:2013-11-21 19:26:47

标签: ruby-on-rails-4 rails-routing single-table-inheritance self-reference

我一直在设计模式之间跳跃,首先尝试多态,现在登陆STI。主要目标是实现服务器>主持人>客户端模型,其中服务器具有主机,主机具有来宾,并且每个都能够拥有帖子。虽然不是问题的主要目的,但设计问题中的任何想法都会有所帮助,因为这是我的第一个rails或ruby项目。

我现在拥有的是:

class Device
     has_may :children, :class_name => "Device", :foreign_key => "parent_id"
     belongs_to :parent, :class_name => "Device"

     has_many :posts
end

class Server,Host,Guest < Device 
end

使用STI是因为Server,Host,Guest基本上具有相同的属性。

我在设置路由和控制器时遇到问题,因此我可以查看服务器的子节点类型为Host或创建新的服务器主机。

1 个答案:

答案 0 :(得分:0)

首先,一件好事就是添加以下内容,让您更轻松地使用它们:

class Device < ActiveRecord::Base
    has_many :children, :class_name => "Device", :foreign_key => "parent_id"
    has_many :servers, -> { where type: "Server" }, :class_name => "Device", :foreign_key => "parent_id"
    has_many :hosts, -> { where type: "Host" }, :class_name => "Device", :foreign_key => "parent_id"
    has_many :guests, -> { where type: "Guest" }, :class_name => "Device", :foreign_key => "parent_id"
    belongs_to :parent, :class_name => "Device"

    has_many :posts
end

有了这个,你就可以做server.hosts等,这很方便。

然后,由于Rails加载系统,您应该将每个子类(Server,Host,Guest)移动到自己的文件中。您可以尝试在控制台中访问模型服务器,您将收到未定义的错误。要修复它,您需要加载模型Device,或者只是将每个子类移动到不同的文件中。

最后,对于路由/控制器部分,我建议您阅读我写的关于STI资源的通用控制器的帖子:http://samurails.com/tutorial/single-table-inheritance-with-rails-4-part-2/

请注意,这是第二部分,有关详细信息,请查看其他文章。