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

时间:2015-03-27 07:19:09

标签: ruby-on-rails ruby-on-rails-4 ancestry

我们有房地产应用,其中用户可以是 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

现在,为了增加应用的用户数量,我们实施了一个 邮件系统 ,用于发送欢迎邮件(当租客添加共享申请人时)注册为一个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

我想我搞砸了一些东西。哪个数据库关系(关联)对我目前的情况来说是最好的。

有人可以对此有所了解。我正在考虑使用ancestry宝石但是如何实现我目前的情况。

3 个答案:

答案 0 :(得分:2)

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

您专注于个人实体;例如,User.find(1).renter非常直观,因为两个模型都描绘了基本相同的人。

我会尝试模拟拥有的内容,而不是尝试模拟人们 的内容。在这种情况下,不要让User拥有Renter,而是让他们有多个 Rentals

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

答案 1 :(得分:1)

我会重构你的代码并让共同申请人只是承租人,这是另一个承租人的孩子

在租用者模型中,您必须添加“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 

我希望这会有所帮助

答案 2 :(得分:1)

使用两个foreign_id创建一个名为Relationship(或其他)的表,关于您希望User和Renter能够彼此做什么(例如,能够&#34;跟随&#34;彼此=&gt; Follower_id和Following_id)。在模型中定义与这些ID相关的方法,然后在视图中调用这些方法以显示关系。