2017-03-26 8 views
0

私は現在、小規模なプロジェクトを開発しています。これはクラシファイドアプリケーションです。異なる属性を持つActiveRecordオブジェクトを格納およびリストする方法は?

このアプリでは、次のような要件があります:車種別にエンジン、製造年、走行距離、説明と実際の状態に関連する広告は明らかにこの情報を持たず、その代わりに他のカテゴリごとにプロパティ、価格、年、部屋の数などを格納する必要があります。

そこで質問です:検索を実行するときにすべてのカテゴリから広告を取得して、単一の結果ページに表示し

1):私ができるように、この問題に取り組むための最善のアプローチがどうなりますか。

2)各カテゴリに対応するデータを保存しますが、私はこのことについて考えていることで抽象化し、最も一般的な属性を持つ、単一の製品モデルを持つこと、である私のデータベースモデル

にあまりにも多くの空の列を避けますこのモデルは、次の関連付け、おそらくbelongs_to category_attributesを決定するCategoryモデルに属します。次に、各カテゴリの属性表が必要になり、製品のために選択されたカテゴリに応じて、次のようなものが表示されます。

カテゴリ "車" has_one vehicles_attributesの商品。

私はこのような状況に

感謝を扱う「Railsの道」であるかを知りたいと思います。

答えて

0

あなたのアプローチは問題ありません。カテゴリセットが非常に静的であれば問題ありません。新しいカテゴリや属性を追加するたびに変更が必要になります。私はより多くの柔軟性を必要なときに、一度私のためにして働いていた

一つのアイデア:

Product.create(category: Category.find_by(:name, "Vehicles"), 
       name: "M1 Abrams", 
       description: "..." 
       spec_attrs: { year: 1975, 
          transmission: "manual" 
          max_speed: 72 }) 
Product.create(category: Category.find_by(:name, "Estates"), 
       name: "Taj Mahal", 
       description: "..." 
       spec_attrs: { year: 1653, 
          rooms: 268, 
          country: "India", 
          city: "Agra" }) 

明らかな欠点は、それがより多くを必要とされている。

# Migration 
create_table :products do |t| 
    t.integer :category_id 
    t.string :name 
    t.string :description 
    t.[...] # maybe other common fields here 
    t.string :spec_attrs, limit: 1000 
    t.timestamps 
end 

# Model 
class Product 
    belongs_to :category 
    serialize :spec_attrs, Hash 
end 

このセットアップは、次のようなさまざまな製品を作成することができます属性の存在、型および値を検証するための努力(プログラムで行う必要があります)、記述的な属性などがあればspec_attrsの長さに注意してください。将来必要なものを考えて決定してください。

関連する問題