Ruby on rails 如何更新我的用户/产品关联

Ruby on rails 如何更新我的用户/产品关联,ruby-on-rails,ruby-on-rails-4,model-associations,Ruby On Rails,Ruby On Rails 4,Model Associations,我正在尝试创建一个应用程序来共享或提供产品。所以我有两个模型:用户模型和产品模型。 用户可以拥有许多产品,作为所有者或借款人。一个产品只有一个所有者和一个借款人 首先,我做了如下事情: >rails生成模型用户名:string 类用户 拥有多个:自有产品,类别名称:“产品”,外键:“所有者id” 有很多:借用的产品,类别名称:“产品”,外键:“借用者id” 结束 >rails生成模型产品名称:字符串所有者\u id:integer借款人\u id:integer 类产品 属于:所有者,类别名称:

我正在尝试创建一个应用程序来共享或提供产品。所以我有两个模型:用户模型和产品模型。 用户可以拥有许多产品,作为所有者或借款人。一个产品只有一个所有者和一个借款人

首先,我做了如下事情:

>rails生成模型用户名:string
类用户
拥有多个:自有产品,类别名称:“产品”,外键:“所有者id”
有很多:借用的产品,类别名称:“产品”,外键:“借用者id”
结束
>rails生成模型产品名称:字符串所有者\u id:integer借款人\u id:integer
类产品
属于:所有者,类别名称:“用户”,外键:“所有者id”
属于:借款人,类别名称:“用户”,外键:“借款人id”
结束
我在产品控制器中添加了一个安全过滤器,该过滤器仅为产品所有者启用更新方法。但是当我想更改产品的借用者时,我遇到了某种问题,因为借用者从来都不是所有者,所以产品无法更新

所以现在我想知道我是否应该把外键从我的产品模型中拿出来,以便分离用户对自己产品的更新操作,以及用户借用不属于他的产品的更新操作

>rails生成模型用户名:string
类用户
有很多:属性
你有很多贷款吗
通过::properties拥有多个:拥有的产品
有很多:借的产品,通过::贷款
结束
>rails生成模型属性所有者\u id:integer拥有\u产品\u id:integer
类属性
属于:所有者,类别名称:“用户”,外键:“用户id”
属于:自有产品,类别名称:“产品”,外键:“产品id”
结束
>rails生成贷款借款人模型\u id:integer借用\u产品\u id:integer
集体贷款
属于:借款人,类别名称:“用户”,外键:“用户id”
属于:借用的产品,类别名称:“产品”,外键:“产品id”
结束
>rails生成模型产品名称:string
类产品
有一个:财产
有一个:贷款
拥有一个:所有者,通过::属性
有一个:借款人,通过:贷款
结束

您对此有何看法?

由于借用的产品和拥有的产品是同一类型的对象,具有相同的属性列表,但仅在行为上有所不同,因此我将对
产品使用单表继承

迁移:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      # ...

      t.timestamps
    end
  end
end

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.integer :ownerable_id
      t.string :ownerable_type
      # ...

      t.timestamps
    end
  end
end
class CreateUsers
型号:

class User < ActiveRecord::Base
  has_many :products, :as => :ownerable
end

class Product < ActiveRecord::Base
  belongs_to :user, :polymorphic => true
end

class OwnedProduct < Product
end

class BorrowedProduct < Product
end
class用户:可拥有
结束
类产品true
结束
类别自有产品<产品
结束
类借用产品<产品
结束

这种方法的好处是,您可以在每个模型中定义适当的行为,而无需询问它是“拥有”还是“借用”。只需要您的模型做什么,让每个对象做正确的决定。

谢谢,但我认为这会使事情复杂化很多。这些产品可以同时拥有和借用,它们一点也不不同。我不明白这有多复杂<代码>用户
拥有一个对象,或者它正在借用一个对象(因为它不拥有它)。由于它们没有任何不同,这也反映在
产品
借用产品
拥有产品
都来自同一个数据库表这一事实上。唯一的区别是rails自动为您处理实例化的产品类型。我还认为,与实现
属性
贷款
模型的其他方法相比,这要简单得多。