我们有房地产应用,其中用户可以是 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宝石但是如何实现我目前的情况。
答案 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相关的方法,然后在视图中调用这些方法以显示关系。