将has_one关联转换为has_many



想知道我的关系,不确定这是否会导致未来的一些问题。

我与用户和租约有以下关系。

class User < ApplicationRecord
has_one :lease, foreign_key: "tenant_id"
has_many :leases, foreign_key: "landlord_id"
end

class Lease < ApplicationRecord
belongs_to :tenant, class_name: "User"
belongs_to :landlord, class_name: "User"
end

我正试图将与租户的关系和租约转换为有许多,但我不知道如何处理这个正确的方式。

我让这个和

一起工作
class User < ApplicationRecord 
has_many :leases_as_landlord, class_name: "Lease", foreign_key: "tenant_id"
has_many :leases_as_tenant, class_name: "Lease", foreign_key: "landlord_id"
end

class Lease < ApplicationRecord
belongs_to :tenant, class_name: "User", inverse_of: :leases_as_tenant
belongs_to :landlord, class_name: "User", inverse_of: :leases_as_landlord
end

但是我不喜欢叫User.leases_as_landlordUser.leases_as_tenant。我想做的就是调用User.leases来返回User作为房东或租户的租约。

您可以添加实例方法:

class User < ApplicationRecord 
has_many :leases_as_landlord, class_name: "Lease", foreign_key: "tenant_id"
has_many :leases_as_tenant, class_name: "Lease", foreign_key: "landlord_id"
def leases
leases_as_landlord.or(leases_as_tenant)
end
end

它也会返回ActiveRecord_AssociationRelation,你可以在它上面链接其他ActiveRecord方法。

我还建议遵循Rails惯例,以复数形式命名您的has_many关联。

class User < ApplicationRecord 
has_many :landlord_leases, class_name: 'Lease', foreign_key: :tenant_id
has_many :tenant_leases, class_name: 'Lease', foreign_key: :landlord_id
def leases
landlord_leases.or(tenant_leases)
end
end

最新更新