如何实现模型“转让所有权”的数据结构

时间:2015-11-02 10:24:58

标签: ruby-on-rails orm

我正在使用rails来构建一个应用程序,其中所有者拥有许多产品。每个产品都可以在需要时转移给另一个所有者。

我第一次想到的是,我想象一个简单的关系

Owner has_many :products product belongs_to owner

由于我需要添加many_to_many关系,我想我可以添加owners_products_table。但是,我无法区分每个所有者拥有产品的时间。

我想添加start_owning_atend_owning_at等列。但它似乎使所有查询过程都非常麻烦..

我想知道如何实现转让所有权数据关系?

1 个答案:

答案 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字段设置为切换时间。