如何针对这种特定情况实施祖先
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
:
而不是 User
有 Renter
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 相关的方法,然后在您的视图中调用这些方法以显示关系。
我们有一个 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
:
User
有 Renter
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 相关的方法,然后在您的视图中调用这些方法以显示关系。