我正在创建一个需要在同一个表之间进行多对多关联的RoR应用程序(至少在理论上)。
怎么样?好吧,我需要一个用户表,其中包含两种用户:服务器和客户端,或多或少都像这个想法老师和学生(有私人课程,但有多位老师),或医生和病人
我的第一个想法是简单地创建一个用户表(你知道,登录,电子邮件和个人信息)并为其分配一个角色(服务器或客户端),但后来我认为这样做这种与第三表的联系会很麻烦
USER< -----> USER_USER
但创建两个" login"的想法表示每个角色的表,以及关联的第三个表听起来不对。
Client_Login< ----- thru ---> Client_Server< --- thru --->服务器
为简单起见,客户端不能是另一个客户端的服务器,而服务器不能是另一个服务器的客户端。 显然,服务器可以有多个客户端,而客户端有多个服务器
如何建议建立这种关系?
答案 0 :(得分:1)
如果您需要在两者之间明确地使用不同的方法,即服务器和客户端,我假设您需要不同的类。然后,您可能希望查看单表继承(STI)。这将允许您使用一个User表,但有两个不同的模型使用它。
class User < ActiveRecord::Base
belongs_to :another_model #example association that will exist for all user types
self.inheritance_column = :role
# if you need to be able to tell what role are available
def self.roles
%w(Client Server)
end
end
class Client < User
has_many :server_clients
has_many :servers, through: :server_clients
end
class Server < User
has_many :server_clients
has_many :clients, through: :server_clients
end
然后,您必须为网桥设置一个简单的server_client.rb模型。
示例来自:http://samurails.com/tutorial/single-table-inheritance-with-rails-4-part-1/
这将允许您为User类中的所有用户提供常用功能,并在相应的Server和Client类中提供特定功能。
答案 1 :(得分:1)
它一直都在做。拥有多对多的回报是很常见的。在层级中常见的是处理人与人之间的关系,(依赖,经理,孩子等......)
class User
has_many :user_relations, dependent: destroy, inverse_of: :user
has_many :dependent_users, through: :user_relations
has_many :dependent_upon_users, through: user_relations, source:
:dependent_upon
end
class UserRelation < ActiveRecord::Base
belongs_to :user
belongs_to :dependent_upon, class_name: User
validates_presence_of :user, :dependent_upon
end