0

製品を共有または提供するためのアプリを作成しようとしています。したがって、ユーザーと製品の2つのモデルがあります。ユーザーは、所有者または借用者として、多くの製品を持つことができます。製品の所有者は 1 人だけで、借り手は 1 人だけです。

最初に私はそのようなことをしました:

> rails generate model User name:string
class User
  has_many :owned_products, class_name: "Product", foreign_key: "owner_id"
  has_many :borrowed_products, class_name: "Product", foreign_key: "borrower_id"
end

> rails generate model Product name:string owner_id:integer borrower_id:integer
class Product
  belongs_to :owner, class_name: "User", foreign_key: "owner_id"
  belongs_to :borrower, class_name: "User", foreign_key: "borrower_id"
end

製品の所有者に対してのみ更新方法を有効にするセキュリティ フィルターを製品コントローラーに追加しました。しかし、製品の借用者を変更したい場合、借用者が所有者ではないため、製品を更新できないため、何らかの問題があります。

だから今、自分の製品に対するユーザーの更新アクションと、属していない製品を借りるためのユーザーの更新アクションを切り離すために、製品モデルからforeign_keyを取り出すべきではないかどうか疑問に思っています彼に...

> rails generate model User name:string
class User
  has_many :properties
  has_many :loans
  has_many :owned_products, through: :properties
  has_many :borrowed_products, through: :loans
end

> rails generate model Property owner_id:integer owned_product_id:integer
class Property
  belongs_to :owner, class_name: "User", foreign_key: "user_id"
  belongs_to :owned_product, class_name: "Product", foreign_key: "product_id"
end

> rails generate model Loan borrower_id:integer borrowed_product_id:integer
class Loan
  belongs_to :borrower, class_name: "User", foreign_key: "user_id"
  belongs_to :borrowed_product, class_name: "Product", foreign_key: "product_id"
end

> rails generate model Product name:string
class Product
  has_one :property
  has_one :loan
  has_one :owner, through: :property
  has_one :borrower, through: :loan
end

あなたはそれについてどう思いますか ?

4

1 に答える 1

1

借用製品と所有製品は、同じ属性リストを持つ同じタイプのオブジェクトですが、動作のみが異なるため、単一テーブル継承を使用しProductます。

移行:

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 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

このアプローチの利点は、「所有」か「借用」かを尋ねることなく、各モデルで適切な動作を定義できることです。モデルに何をすべきかを伝えるだけで、決定は各オブジェクトに任せて正しいことを行うことができます。

于 2013-06-03T17:00:16.370 に答える