2016-06-24 8 views
0

私は最近、RoRの学習を始めました。私は趣味のプロジェクトを作成しています。私のActiveRecordの関係のレビューを探しています

簡単な背景:各顧客はアカウント番号で識別されます。各商品の販売にはアカウント番号があり、商品表にはすべての特定の商品データが含まれています。

私の質問は - 私が今持っているフォーマットでは、これは私がこれらのテーブルをリンクするべき正しい方法ですか?私が抱えている問題の1つは、製品のメジャーに基づいて販売のグループをフィルタリングすることです。だから私は顧客がいて、メジャーが「商業」であるところで製品販売を見たいと思っていますが、このデータをフィルタリングするにはどうすればいいですか?作成した範囲を参照してください - しかし、私はそれを使用する方法がわかりません。

class Product < ActiveRecord::Base 
    has_many :product_sales, :primary_key => :prodnum, :foreign_key => :prodnum 
    has_many :customers, through: :sales 
    scope :commercial_products, -> { where(major: 'Commercial') } 
end 




class ProductSale < ActiveRecord::Base 
    belongs_to :customer, :foreign_key => :account 
    belongs_to :product, :foreign_key => :prodnum, :primary_key => :prodnum 
end 




class Customer < ActiveRecord::Base 
    has_many :product_sales, :primary_key => :account, :foreign_key => :account 
    has_many :products, through: :product_sales 
end 

と私のスキーマ

create_table "customers", force: :cascade do |t| 
    t.integer "account" 
    t.string "name" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 


    create_table "product_sales", force: :cascade do |t| 
     t.integer "account" 
     t.string "month" 
     t.string "prodnum" 
     t.integer "sales" 
     t.integer "qtyshipped" 
     t.datetime "created_at", null: false 
     t.datetime "updated_at", null: false 
end 



create_table "products", force: :cascade do |t| 
     t.string "pcatcode" 
     t.string "pcatname" 
     t.string "major" 
     t.string "prodline" 
     t.string "brand" 
     t.string "tier" 
     t.string "prodnum" 
     t.string "proddesc" 
     t.datetime "created_at", null: false 
     t.datetime "updated_at", null: false 
end 
+0

あなたは、私がお勧め専攻のAA有限集合を持っている場合は、(Active Recordの列挙型を見てみましょうhttp://api.rubyonrails.org/v4.1/classes/ActiveRecord /Enum.html)、これにより、文字列(よりパフォーマンスの高い)ではなくDBに整数を格納できるようになり、 'products.commercial'のような便利なメソッドにアクセスできます。 – Leito

答えて

0

...私は顧客を持っていると私は唯一の主要は「商用」である商品の販売を表示したい、どのように私は、このデータをフィルタリング行くのです?

これはそれを行う必要があります。

@customer.product_sales.where(product: {major: 'Commercial'}) 

PS。お使いのモデルが正しいように見えますが、このビット

has_many :customers, through: :sales 

# Probably you meant: through: product_sales 
+0

ありがとう - 私は大統領のための "そのような列"を得ていたが、これは動作しませんでした。しかし、これで私は少しの研究をし、@ customer.product_sales.joins(:product).where(:products => {{major => 'Residential'})という正しい方向に私を連れて来ました。これは、私が望んでいたのと同じように機能しています。 – Kevin

+0

よろしくお願いします、参加を忘れました... – Uzbekjon

関連する問題