Търся преглед на моите връзки с ActiveRecord

Наскоро започнах да уча RoR и създавам хоби проект.

Така че малко бърза предистория: Всеки клиент се идентифицира с номер на сметка. Всяка продажба на продукт има приписан номер на сметка и таблицата с продукти съдържа всички конкретни данни за продукта.

Въпросът ми е - с формата, който имам сега, това ли е правилният начин, по който трябва да свързвам тези таблици? Един от проблемите, които имам, е филтрирането на група продажби въз основа на основни продукти. Да кажем, че имам клиент и искам да видя само продажбите на продукти, където основното е „търговско“, как да филтрирам тези данни? Вижте обхвата, който създадох - но не съм сигурен как да го използвам.

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

person Kevin    schedule 24.06.2016    source източник
comment
Ако имате краен набор от специалности, препоръчвам ви да разгледате Active Record Enums (api.rubyonrails.org/v4.1/classes/ActiveRecord/Enum.html), това ще ви позволи да съхранявате цяло число в DB вместо низ (което е по-производително) и ви дава достъп до някои удобни методи като: products.commercial например.   -  person Leonel Galán    schedule 24.06.2016


Отговори (1)


... Имам клиент и искам да видя само продажбите на продукти, където основното е "търговско", как да филтрирам тези данни?

Това трябва да го направи:

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

PS. Вашите модели изглеждат правилни, но това малко

has_many :customers, through: :sales

# Probably you meant: through: product_sales
person Uzbekjon    schedule 24.06.2016
comment
Благодаря ви - това обаче не проработи, тъй като не получавах такава колона за специалността. Това обаче ме накара да направя малко проучване и ме насочи в правилната посока с @customer.product_sales.joins(:product).where(:products =› {:major =› 'Residential'}). Това работи точно както исках. Благодаря ти - person Kevin; 24.06.2016