我正在使用rails来构建一个应用程序,其中所有者拥有许多产品。每个产品都可以在需要时转移给另一个所有者。
我第一次想到的是,我想象一个简单的关系
Owner has_many :products
product belongs_to owner
由于我需要添加many_to_many关系,我想我可以添加owners_products_table
。但是,我无法区分每个所有者拥有产品的时间。
我想添加start_owning_at
和end_owning_at
等列。但它似乎使所有查询过程都非常麻烦..
我想知道如何实现转让所有权数据关系?
答案 0 :(得分:2)
那么,您需要跟踪每个用户拥有产品的时间段吗?我认为你对如何建模的直觉是正确的,你可以努力使查询简单直观。
我会这样建模:
Owner
has_many :product_ownerships
has_many :products, :through => :product_ownerships
Product
has_many :product_ownerships
has_many :owners, :through => :product_ownerships
#some named scopes for convenience
scope :at_time, ->(time) { where("product_ownerships.ownership_starts_at <= ? and product_ownerships.ownership_ends_at => ?", time, time)}
scope :current, -> { at_time(Time.now) }
ProductOwnership
belongs_to :owner
belongs_to :product
#fields: product_id, owner_id, ownership_starts_at, ownership_ends_at
#some named scopes for convenience
scope :at_time, ->(time) { where("product_ownerships.ownership_starts_at <= ? and product_ownerships.ownership_ends_at => ?", time, time)}
scope :current, -> { at_time(Time.now) }
现在你应该能说出像
这样的话 @owner = Owner.find_by_id(params[:id])
@products = @owner.products.current
#or
@products = @owner.products.at_time(Time.parse(params[:time]))
等,或者同样列出product_ownership而不是产品:例如,如果您有一个表单页面,用户可以更新product_ownerships的时间,这将非常有用。
编辑 - 顺便说一下,在此架构中,当新所有者获取产品时,您应该创建一个新的ProductOwnership,并将旧所有者的ownership_ends_at
字段设置为切换时间。