0

Rails2.3.5でオンライン衣料品店の申し込みを書きました。顧客が「製品の詳細」ページを表示したときに、関連する製品を表示したい。

たとえば、お客様がスーツの詳細ページを表示した場合、ベスト、靴、ベルトなど、ドレスに合ったアクセサリー製品を表示したいと思います。関連商品をアンサンブルと名付けました。しかし、ベスト、靴、ベルトも私が苦労している製品です。

私はそれを次のように機能させていますが、それがRailsの方法ではないことを知っています。すべての製品のProductsテーブルがあります。ここでは重要ではありませんが、ProductDetailsテーブルもあります。次の列を持つEnsemblesテーブルがあります。

  • product_id-メインまたはオリジネーション製品、詳細ページに表示される製品
  • outfit_id-関連製品またはアクセサリ製品

データの設定では、製品リストに、製品ごとにEnsembleリンクがあります。このリンクをクリックすると、Ensemblesコントローラーのインデックスアクションに移動します。

「メイン」製品のIDを使用して、関連するすべてのEnsemble行をproduct_idで検索するか、新しいアンサンブルを作成して、メイン製品のIDをproduct_idとして割り当てます。@ product.related_productsを実行して、Ensembleコレクションを取得できるようにしたいと思います。

また、インデックスページには、主な製品の列を一覧表示しているので、ユーザーは主な製品がリストから選択したものであると確信できます。他の製品の選択リストもあり、[アンサンブルに追加]アクションがあります。

最後に、同じインデックスページに、すでにアンサンブルにある製品を表示するテーブルがあり、そのリストの各行には、アンサンブルから特定の製品を削除するための破棄リンクがあります。単一のアンサンブル行@ensembleが与えられた場合、@ ensemble.productを実行して、アンサンブル行のoutfit_idに関連するProductを取得できれば便利です。

アソシエーションなしで動作しますが、コントローラーでクエリを実行して、独自の@ product、@ ensemble、および@ensemblesコレクションを作成する必要があります。また、アンサンブル行を破棄するために私が見つけた唯一の方法は、Ensemble.connection.delete(sql to delete)によるものであり、単純な@ensemble.destroyは機能しません。

誰もが私がアソシエーションを設定する方法を知っているか、同様の設定を説明するサイトへのリンクを持っています。私が見つけた例はどれも同じテーブルを使用していません。彼らはBからCに関連するAを持っています。私はAを他のAからBに関連させたいです。

4

1 に答える 1

2

関連付けを次のように設定します。

class Product < ActiveRecord:Base
  has_many :ensembles
  has_many :outfits, :through => :ensembles
end

class Ensemble < ActiveRecord:Base
  belongs_to :product
  belongs_to :outfit, :class_name => "Product", :foreign_key => :outfit_id
end

これで、次のことができます。

p.outfits # all ensemble products for given product.
p.outfits << p2 # add product to the ensemble of given product.
p.outfits.delete(p3) # delete product from the ensemble of given product.
于 2010-05-01T17:45:30.393 に答える