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



我们有一个房地产应用程序,其中用户可以是租房者房东(业主)。租房者可以搜索业主列出的特定房屋。租房者还可以添加其他人(与特定租房者住在一起的朋友或熟人)。在应用程序中,我们将他们视为辅助应用程序

型号

# 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

现在,为了增加该应用程序的用户数量,我们实现了邮件系统,该系统会发送欢迎邮件(当租房者添加辅助申请人时)以注册为用户。辅助申请人可以选择成为租房者,也可以添加许多辅助申请人。这个过程又继续下去,从而增加了用户。

这就像一个树结构,现在我想建立一个完美的数据库关系(关联)来跟踪流入的用户,以及租户/共同应用程序的用户。

现在,当前模型结构(尚未开发)看起来像这个

# 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

我想我把事情搞砸了。哪个数据库关系(关联)最适合我当前的情况。

有人能帮我照一下吗。我正在考虑使用祖先宝石,但如何实现到我目前的情况。

我发现,有时在设计关联时,即使是视角上的一个小变化,也可以使它们更自然地流动。

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

与其试着为的人建模,我不如试着为他们拥有的东西建模CD_4

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

我会重构您的代码,使共同申请人只是租户,它是另一个租房者的子代

在你的租房者模型中,你必须添加一个"parent_id"来知道共同申请人属于谁。

现在在你的模型中,你可以做一些类似的事情

#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 

我希望这能帮助

创建一个名为Relationship(或其他)的表,其中包含两个foreign_id,它们涉及您希望用户和租房者能够相互做什么(例如能够"跟随"对方=>Follower_id和Following_id)。在模型中定义与这些id相关的方法,然后在视图中调用这些方法来显示关系。

相关内容

  • 没有找到相关文章

最新更新