如何针对这种特定情况实施祖先

How to implement ancestry for this specific situation

我们有一个 Real-Estate 应用程序,其中 User 可以是 Renter房东(所有者)。租房者可以搜索业主列出的特定房屋。租房者还可以添加其他人(与该特定租房者同住的朋友或熟人)。在应用程序中,我们将他们视为 Coapplicants

型号

# user.rb
class User < ActiveRecord::Base
  has_one :renter
  has_one :owner
end

# renter.rb
class Renter < ActiveRecord::Base
  belongs_to :user
  has_many :coapplicants
end

# coapplicant.rb
class Coapplicant < ActiveRecord::Base
  belongs_to :renter
end

现在,为了增加该应用程序的用户数量,我们实施了一个邮件系统,它会发送一封欢迎邮件(当Renter 添加一个 Coapplicant) 作为 User.And 注册,Coapplicant 可以选择成为 Renter,也可以添加许多 Coapplicants。并且该过程再次继续导致用户增加。

这就像一个树结构,现在我想建立一个完美的数据库关系(关联)来跟踪流入和流经的用户renter/coapplicant他们来了

现在的当前模型结构(尚未开发)如下所示

# user.rb
class User < ActiveRecord::Base
  has_one :renter
  has_one :owner
end

# renter.rb
class Renter < ActiveRecord::Base
  belongs_to :user
  has_many :coapplicants
  has_many :coapp_renters,
           :through => :coapplicants
  has_many :inverse_coapplicants,
           :class_name => "Coapplicant",
           :foreign_key => "coapp_renter_id"
  has_many :inverse_coapp_renters,
           :through => :inverse_coapplicants,
           :source => :renter
end

# coapplicant.rb
class Coapplicant < ActiveRecord::Base
  belongs_to :renter
  belongs_to :coapp_renter,
             :class_name => "Renter"
end

我想我有点搞砸了。 数据库关系(关联) 最适合我目前的情况。

有人可以解释一下 please.I 我正在考虑使用 ancestry gem 但如何根据我目前的情况实施。

我会重构你的代码,让 co-applicants 只是一个 renter,它是 child另一个 承租人

在您的承租人模型中,您必须添加一个 "parent_id" 才能知道 co-applicants 属于谁。

现在在您的模型中,您可以执行类似

的操作
#renter.rb
class Renter < ActiveRecord::Base
  belongs_to :user
  has_many :children, :class_name => "Renter"
  belongs_to :parent, :class_name => "Renter" 
end

# Example calls 
Renter.first.children 
Renter.first.parent 

希望对您有所帮助

我发现有时在设计联想时,即使是视角上的微小变化也能让它们更自然地流动。

您只关注个人实体; User.find(1).renter 例如不是很直观,因为两个模型基本上描绘的是同一个人。

与其尝试模拟人们 是什么 ,我会尝试模拟他们 拥有的东西 。在这种情况下,让他们有许多 Rentals:

而不是 UserRenter
class User < ActiveRecord::Base
  has_many :rentals,
            foreign_key: 'renter_id'
end

class Rental
  belongs_to :renter,
              class_name: 'User'
  belongs_to :property
end

我在这里假设您有一个模型 Property 代表正在租用的东西 - 如果它不存在,请忽略它。

对业主来说也是一样的。 User 成为拥有者只需拥有 Ownerships:

class User < ActiveRecord::Base
  has_many :ownerships,
            foreign_key: 'owner_id'
end

class Ownership
  belongs_to :owner,
              class_name: 'User'
  belongs_to :property
end

共同申请略有不同,因为它属于Rental:

class CoApplication
  belongs_to :co_applicant,
              class_name: 'User'
  belongs_to :rental
end

class Rental
  has_many :co_applications
end

class User < ActiveRecord::Base
  has_many :co_applications,
            foreign_key: 'co_applicant_id'
  has_many :received_co_applications,
            through: :rentals,
            source: :co_applications
end

现在您的 Users 可以同时是业主、租客、共同申请人。这些关联让您可以捕捉到发生的一切 - 谁通过谁签署了只是时间顺序问题。

从这里开始,嵌套您的 has_many :through 关联以获得您想要的任何东西。

想知道房东拥有的房产吗?

has_many :owned_properties,
          through: :ownerships,
          source: :property

她的房产的租金?

has_many :leases,
          through: :owned_properties,
          source: :rentals

租她房子的人?

has_many :renters,
          through: :leases,
          source: :renter

联合申请也是如此。想知道谁与用户共同申请?

has_many :co_applicants,
          through: :received_co_applications,
          source: :co_applicant

创建一个 table 与两个 foreign_ids 的关系(或其他东西),关于您希望用户和承租人能够彼此做什么(例如能够 "Follow" 彼此 => Follower_id 和 Following_id)。在您的模型中定义与这些 ID 相关的方法,然后在您的视图中调用这些方法以显示关系。