0

私はコーディングの初心者で、RoR を発見しています。ユーザーと製品を使用してアプリケーションを作成したいと考えています。ユーザーのことはいいのですが、製品のアーキテクチャについて疑問に思っています...

ここで私が想像する製品モデル:

Product :

- Name
- Owner
- Borrower
- Location
    - Address
    - GPS Coordinates
- Comments
    - Title
    - Content
    - User
- Category

そして、ここに私の主なモデルがあります:

Class User
    has_many :owned_products, class_name: "Product", foreign_key: "owner_id"
    has_many :borrowed_products, class_name: "Product", foreign_key: "borrower_id"
    has_one :location, as: :localizable
end

$ rails generate model Location address:string coordinates:string
Class Location
    belongs_to :localizable, polymorphic: true
end

$ rails generate model Comment title:string content:text user_id:integer
Class Comments
    belongs_to :product
    has_one :user
end

$ rails generate model Product name:string owner_id:integer borrower_id:integer location_id:integer comment_id:integer category_id:integer
Class Product
    belongs_to :owner, class_name: "User", foreign_key: "owner_id"
    belongs_to :borrower, class_name: "User", foreign_key: "borrower_id"
    has_one :location, as: :localizable
    has_many :comments
    has_one :category
end

したがって、次のようなすべてのカテゴリ サブモデルを作成する必要があるかどうか疑問に思っています。

- Consumption
    - Name
    - Utility
    - Builder
- Culture
    - Title
    - Barcode
    - Type
        - Book
            - Author
            - Publisher
        - Video
            - Length
            - Format
- Food
    - Name
    - Cooking Date
    - Weight

私は次のように書き留めます:

$ rails generate model Category consumption_id:integer culture_id:integer food_id:integer
Class Category
    belongs_to :product
    has_one :consumption
    has_one :culture
    has_one :food
end

  $ rails generate model Consumption name:string utility:string builder:string
  Class Consumption
      belongs_to :category
  end


  $ rails generate model Culture title:string barcode:integer type_id:integer
  Class Culture
      belongs_to :category
      has_one :type
  end

    $ rails generate model Type book_id:integer video_id:integer
    Class Type
        belongs_to :culture
        has_one :book
        has_one :video
    end

      $ rails generate model Book author:string publisher:string
      Class Book
          belongs_to :type
      end

      $ rails generate model Video length:string format:string
      Class Video
          belongs_to :type
      end

  $ rails generate model Food name:string cooking_date:datetime weight:float
  Class Food
      belongs_to :category
  end

または、次のように 1 つのレベルだけにしておく方がよい場合:

- Category_type (consumption, culture, or food)
- Name (or title)
- Utility
- Builder
- Barcode
- Culture_type
- Author
- Publisher
- Length
- Format
- Cooking_date
- Weight

それは私に与えるでしょう:

$ rails generate model Category category_type:string name:string utility:string builder:string barcode:integer culture_type:string author:string publisher:string length:integer format:string cooking_date:datetime weight:float
Class Category
    belongs_to :product
end

最初の方法の方が理解しやすいと思いますが、2 番目の方法ほど効率的ではないと思います。ヒントを教えてください。


@ r4mに従って、これが私がしたことです:

$ rails generate model Category
Class Category
    belongs_to :product
    belongs_to :categorizable, polymorphic: true
end

  $ rails generate model Consumption name:string utility:string builder:string
  Class Consumption
      has_many :categories, :as => :categorizable
  end


  $ rails generate model Culture title:string barcode:integer type_id:integer
  Class Culture
      has_many :categories, :as => :categorizable
      has_one :type
  end

  $ rails generate model Food name:string cooking_date:datetime weight:float
  Class Food
      has_many :categories, :as => :categorizable
  end

そして、カテゴリの移行を次のように変更しました。

class CreateCategories < ActiveRecord::Migration
  def change
    create_table :categories do |t|
      t.references :categorizable, polymorphic: true
      t.timestamps
    end
  end
end

でも、どうも私には理解できそうにありません…。

@user のすべての「消費」製品を取得したい場合、どうすればよいですか? そのようなことはうまくいくでしょうか?

@consumptions = @user.products.consumptions
4

1 に答える 1

2

同じカテゴリ (および同じ消費と文化のパラメーター) に属する食品の配列があるとします。最後のモデルでは、配列を行 (この場合は Category テーブルの行) に割り当てることができないため、多くの冗長性があります ( Rails でサポートされているタイプについては、こちらを参照してください)。これらの食品エントリを配列ではなく単一のエンティティとして割り当てるためだけに、カテゴリの詳細に関して同じ情報を複製する必要があります。

アソシエーションを使用すると、異なるモデル間の関係を作成できるため、提案する最初のソリューションを検討する必要があります (たとえば、「多対多」の関係の場合は配列から配列へ)。

さらに、ポリモーフィック アソシエーションを使用してカテゴリ モデルを簡素化することをお勧めします。こちらを参照してください。

于 2013-05-13T14:58:45.917 に答える