我们有一个房地产应用程序,其中用户可以是租房者或房东(业主)。租房者可以搜索业主列出的特定房屋。租房者还可以添加其他人(与特定租房者住在一起的朋友或熟人)。在应用程序中,我们将他们视为辅助应用程序。
型号
# 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相关的方法,然后在视图中调用这些方法来显示关系。