我一直在设计模式之间跳跃,首先尝试多态,现在登陆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或创建新的服务器主机。
答案 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/。
请注意,这是第二部分,有关详细信息,请查看其他文章。