0

私は新しい Rails プロジェクトに取り組んでおり、このプロジェクトには製品と製品カテゴリがあります。

したがって、これらのカテゴリは、ボート、家、車などの名前を付けると、互いに大きく異なります。

車のカテゴリには、「時速」、「モデル」、「ブランド」、「年式」などの基準があります。家のカテゴリには、「部屋」、「年」、「都市」、「郵便番号」などがあります。

これを非常に動的にして、基準を追加/削除し、バックエンド パネルからカテゴリを追加/削除できるようにしたいと考えています。

今私の質問に、私はこれをいじっていましたが、この概念の論理を実際に理解することはできません.いくつかの解決策を試しましたが、それらは非常に奇妙で非常に非効率的です. 筋金入りの Rails コーダーが、このパズルの解き方についてヒントをくれるかもしれません。

だから私が思いつくことができる最善の解決策はこれでした:

4 つのモデル:

 _______________________
| Product.rb            |
 -----------------------
| id          | integer |
 -----------------------
| category_id | integer |
 -----------------------
| Title       | string  |
 -----------------------
| Description | text    |
 -----------------------

 _______________________
| Category.rb           |
 -----------------------
| id          | integer |
 -----------------------
| Title       | string  |
 -----------------------
| Description | text    |
 -----------------------

 _______________________
| Criteria.rb           |
 -----------------------
| id          | integer |
 -----------------------
| category_id | integer |
 -----------------------
| Name        | string  |
 -----------------------
| Default     | string  |
 -----------------------
| Description | text    |
 -----------------------

 _______________________
| ProductInfo.rb        |
 -----------------------
| id          | integer |
 -----------------------
| product_id  | integer |
 -----------------------
| Name        | string  |
 -----------------------
| Value       | text    |
 -----------------------

接続方法:

Criteria.rb is connected to Category.rb with a category_id and has_many/belongs_to relation
Product.rb is connected to Category.rb with a category_id and has_many/belongs_to relation
ProductInfo.rb is connected to Product.rb with a product_id and has_many/belongs_to relation.
Category.rb is the heart og this solution. The category model, both have many products and criterias.

実際にはどのように機能するか:

In the show category page, i would first print out all the criterias for the given category.
Afterwards i would make a @products.each do |product|.
In the @products.each block, i would make a @category.criterias.each do |criteria|.
In the @category.criterias.each block, i would then run something like product.productinfos.where(:name => criteria.name). 
And then run it one by one.

結論として、この解決策は機能しますが、それが最善の解決策であるとは思えません。トラフィックが多く、データが多いため、ロード時間が非常に長くなります。そして、非常に奇妙で読めないコードを書く必要があります。

これはかなり長い質問で、非常に紛らわしいかもしれませんので、何かあれば教えてください。また、StackoverflowとGoogleの両方で、このような質問をかなり探しましたが、このようなものを見つけることができませんでした.

オルフ・ニールセン。

4

2 に答える 2

1

私の意見では、パフォーマンスの問題が多いため、これを処理するために追加のテーブルを定義しない方がよいでしょう。このようなことを処理するための私の好みは、products テーブルでシリアル化された列を使用することです。このアプローチでは、データベース内を直接検索する機能が低下しますが、いずれにせよそうしたくないでしょう。検索を処理するには、ある種のインデックス付き検索メカニズムを追加する必要があります。act_as_ferret や、Solr や ElasticSearch のように。

postgres を使用している場合は、https://github.com/softa/activerecord-postgres-hstoreを確認してください

Mysql の場合は、Rails のビルトイン 'store' http://api.rubyonrails.org/classes/ActiveRecord/Store.htmlを使用します。

class Product < ActiveRecord::Base
  has_and_belongs_to_many :categories
  store :settings
end

各カテゴリの基準を設定するには、次のようにします。

class Category < ActiveRecord::Base
  has_and_belongs_to_many :products


  def criteria
     @criteria_list ||= self[:criteria].split('|')
     @criteria_list
  end

  def criteria=(names)
    self[:criteria] = names.join('|')
  end

end

製品がカテゴリに追加されるたびに、そのカテゴリのすべての基準が製品のプロパティ ハッシュ キーで使用可能かどうかを確認します。そうでない場合は、必要に応じてデフォルト値で追加します。

製品のカテゴリのすべての基準フィールドから動的にアクセサー名を取得するプロシージャを使用して、プロパティ ハッシュ ストアのアクセサーをセットアップすることもできます。(今までやったことがないのでよくわかりません)

製品テーブルの type フィールドを使用して、STI (Single table Inheritance) の使用を検討することもできます。(十分に文書化されています) 製品があるカテゴリから別のカテゴリに移動しても、プロパティは変わらないため、このアプローチはわずかに優れています。

class Gadget < Product
   store_accessor :manufacturer, :model
end

class Phone < Gadget
   store_accessor :os, :touch_screen, :is_smart
end

お役に立てれば

于 2012-07-05T01:02:56.513 に答える
0

または、2 番目のアプローチは、nosql データベースを使用することです。非常に安定しているmongoidでmogodbを試してみてください。これは、変数属性の要件に非常に適しています。また、後で非常に簡単に他のカテゴリを追加することもできます。

私が見る限り、mysql を使用すると、このダイナミクス データを格納するために複数のデータベースを作成することになり、パフォーマンスが妨げられます。

アップデート -

データを nosql で柔軟にできるという点以外にも、そこに移行する前に考慮すべきことがたくさんあります。柔軟なデータベース構造が必要であるという事実に基づいて提案しました。mogodb docs から始めてください。これらは良い出発点です。

于 2012-07-19T14:02:46.597 に答える