2016-06-24 2 views
0

Недавно я только начал изучать RoR, и я создаю проект для хобби.Ищете обзор моих отношений ActiveRecord

Итак, некоторый быстрый фон: каждый клиент идентифицируется номером учетной записи. Каждая продажа продукта имеет номер счета, приписываемый ему, а таблица продуктов содержит все данные конкретного продукта.

Мой вопрос - с форматом, который у меня есть сейчас, является ли это правильным способом, я должен связывать эти таблицы? Одна из проблем, с которыми я сталкиваюсь, - это фильтрация группы продаж на основе продукта. Так что скажите, что у меня есть клиент, и я только хочу посмотреть продажи продукта, где майор является «коммерческим», как я могу фильтровать эти данные? См. Область, которую я создал, но я не уверен, как ее использовать.

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

Если у вас есть аа конечное множество специальностей я рекомендую вам взглянуть на Active Record Перечисления (http://api.rubyonrails.org/v4.1/classes/ActiveRecord /Enum.html), это позволит вам хранить целое число в БД вместо String (что более эффективно) и дает вам доступ к некоторым удобным методам, например: '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

Yeap, забыли присоединиться ... – Uzbekjon

Смежные вопросы