间接循环依赖是否可以?

时间:2015-04-17 16:26:13

标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller model

我正在创建一个需要在同一个表之间进行多对多关联的RoR应用程序(至少在理论上)。

怎么样?好吧,我需要一个用户表,其中包含两种用户:服务器客户端,或多或少都像这个想法老师和学生(有私人课程,但有多位老师),或医生病人

我的第一个想法是简单地创建一个用户表(你知道,登录,电子邮件和个人信息)并为其分配一个角色(服务器或客户端),但后来我认为这样做这种与第三表的联系会很麻烦

USER< -----> USER_USER

但创建两个" login"的想法表示每个角色的表,以及关联的第三个表听起来不对。

Client_Login< ----- thru ---> Client_Server< --- thru --->服务器

为简单起见,客户端不能是另一个客户端的服务器,而服务器不能是另一个服务器的客户端。 显然,服务器可以有多个客户端,而客户端有多个服务器

如何建议建立这种关系?

2 个答案:

答案 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