У меня возникли проблемы с моделированием простой системы заказов, в которой клиент может создать заказ, выбрав товары.
Мне нужны были следующие модели: Customer, Order, OrderLine и Item. Клиент создает Заказ, который содержит множество строк Заказа, причем каждая Строка Заказа содержит один Товар с количеством, продажной ценой и т. д. Товары — это «продукты», из которых покупатель может выбирать. После того, как товар выбран и назначено желаемое количество, создается OrderLine.
Учитывая это, как лучше настроить ассоциации?
Вот модели в их текущем состоянии:
class Customer < ActiveRecord::Base
has_many :orders
end
class Item < ActiveRecord::Base
has_many :order_lines
has_many :orders, through: :order_lines
end
class OrderLine < ActiveRecord::Base
belongs_to :order
belongs_to :item
end
class Order < ActiveRecord::Base
has_many :order_lines
has_many :items, through: :order_lines
end
Возможно, Order также должен содержать «belongs_to:customer»?
Вот соответствующие части файла схемы для справки:
create_table "customers", force: :cascade do |t|
t.string "fname"
t.string "middle_initial"
t.string "lname"
t.string "street_add"
t.string "city"
t.string "state"
t.string "zipcode"
t.string "email"
t.string "home_phone"
t.string "cell_phone"
t.string "phone_pref"
t.string "password"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "items", force: :cascade do |t|
t.integer "barcode"
t.text "description"
t.decimal "selling_price", precision: 5, scale: 2
t.string "unit_of_measure"
t.integer "qty_on_hand"
t.integer "location_aisle"
t.string "location_area"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "order_lines", force: :cascade do |t|
t.integer "qty_ordered"
t.decimal "unit_price", precision: 5, scale: 2
t.decimal "total_price", precision: 7, scale: 2
t.integer "order_id"
t.integer "item_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_index "order_lines", ["item_id"], name: "index_order_lines_on_item_id"
add_index "order_lines", ["order_id"], name: "index_order_lines_on_order_id"
create_table "orders", force: :cascade do |t|
t.string "billing_street_add"
t.string "billing_city"
t.string "billing_state"
t.string "billing_zipcode"
t.string "shipping_street_address"
t.string "shipping_city"
t.string "shipping_state"
t.string "shipping_zipcode"
t.string "cc_fname"
t.string "cc_middle_initial"
t.string "cc_lname"
t.string "cc_number"
t.string "cc_security_code"
t.string "cc_exp_month"
t.string "cc_exp_year"
t.decimal "subtotal", precision: 7, scale: 2
t.integer "tax_percent"
t.decimal "shipping_fee", precision: 5, scale: 2
t.decimal "total", precision: 20, scale: 2
t.integer "customer_id"
t.integer "order_line_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_index "orders", ["customer_id"], name: "index_orders_on_customer_id"
add_index "orders", ["order_line_id"], name: "index_orders_on_order_line_id"