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