我目前有一个用户模型
class User < ApplicationRecord
has_one :leases
end
a租赁模式
class Lease < ApplicationRecord
belongs_to :tenant, class_name: 'User'
belongs_to :landlord, class_name: 'User'
end
和租赁型号
class Rental < ApplicationRecord
has_one :lease, dependent: :destroy
end
我只有一个支持租户和房东的用户模型。
我面临的问题是,房东可以与许多不同的租户签订多份租约,但租户一次只能签订一份租约。
我有点困惑于我应该如何正确地构建它。我是否应该与User模型和Lease模型建立has_many关系,而不是has_one,然后只在User模型上使用Lease方法来获得租户的租约?我想要的是类似的东西
tenant.lease
和
landlord.leases
我能做吗?
class User < ApplicationRecord
has_one :lease, foreign_key: "tenant_id"
has_many :leases, foreign_key: "landlord_id"
end
这似乎奏效了,但我不确定这是否是正确的做法。
使用STI,您可以拥有以下型号的
==> user.rb <==
class User < ApplicationRecord
end
==> landlord.rb <==
class Landlord < User
has_many :leases
end
==> tenant.rb <==
class Tenant < User
has_one :lease
end
==> lease.rb <==
class Lease < ApplicationRecord
belongs_to :tenant
belongs_to :landlord
end
然后你可以做之类的事情
irb(main):003:0> landlord = Landlord.create(name: 'the landlord')
=> #<Landlord id: 5, name: "the landlord", type: "Landlord", created_at: "2022-01-03 22:16:56", updated_at: "2022-01-03 22:16:56">
irb(main):004:0> tenant = Tenant.create(name: 'the tenant')
=> #<Tenant id: 6, name: "the tenant", type: "Tenant", created_at: "2022-01-03 22:17:09", updated_at: "2022-01-03 22:17:09">
irb(main):005:0> lease = Lease.create(tenant: tenant, landlord: landlord)
=> #<Lease id: 3, tenant_id: 6, landlord_id: 5, created_at: "2022-01-03 22:17:28", updated_at: "2022-01-03 22:17:28">
irb(main):006:0> tenant.lease
=> #<Lease id: 3, tenant_id: 6, landlord_id: 5, created_at: "2022-01-03 22:17:28", updated_at: "2022-01-03 22:17:28">
irb(main):007:0> landlord.leases
=> #<ActiveRecord::Associations::CollectionProxy [#<Lease id: 3, tenant_id: 6, landlord_id: 5, created_at: "2022-01-03 22:17:28", updated_at: "2022-01-03 22:17:28">]>
要做到这一点,您只需要在User
模型中添加一个type
列,剩下的由Rails来处理
在我看来,您应该采用has_many
方法。房东和租客都是用户。您必须使用"user_id"来代替使用tenant_id
和landlord_id
,并且要识别用户,请使用user_type,即tenant和lanlord。
只是一个意见!!