使用一个用户模型处理has_one和has_many关联



我目前有一个用户模型

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_idlandlord_id,并且要识别用户,请使用user_type,即tenant和lanlord。

只是一个意见!!

相关内容

最新更新