У меня есть тест приложение с моделями следующимRoR ActiveRecord Запрос производит неожиданный результат
ActiveRecord::Schema.define(version: 20140102023300) do
create_table "customers", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "order_products", force: true do |t|
t.integer "customer_id"
t.integer "order_id"
t.integer "product_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "orders", force: true do |t|
t.text "description"
t.integer "customer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "products", force: true do |t|
t.string "description"
t.float "item_price"
t.datetime "created_at"
t.datetime "updated_at"
end
end
Ассоциацией является
class Customer < ActiveRecord::Base
has_many :orders
end
class Order < ActiveRecord::Base
belongs_to :customer
has_many :order_products
end
class OrderProduct < ActiveRecord::Base
belongs_to :order
end
Затем я посеянная базы данных с seeds.rb следующим образом:
customers = Customer.create([{:name => 'Alex'}, {:name => 'Clare'}, {:name => 'Bob'}, {:name => 'Ian'}])
orders = Order.create([
{:description => 'description for order 1',:customer_id => 1},
{:description => 'description for order 2',:customer_id => 2},
{:description => 'description for order 3',:customer_id => 2},
{:description => 'description for order 4',:customer_id => 1},
{:description => 'description for order 5',:customer_id => 4}
])
orderproducts = OrderProduct.create([
{:customer_id => 1, :order_id => 1, :product_id => 1},
{:customer_id => 1, :order_id => 1, :product_id => 2},
{:customer_id => 1, :order_id => 2, :product_id => 4},
{:customer_id => 1, :order_id => 2, :product_id => 7},
{:customer_id => 1, :order_id => 2, :product_id => 3},
{:customer_id => 2, :order_id => 1, :product_id => 5},
{:customer_id => 2, :order_id => 1, :product_id => 6},
{:customer_id => 2, :order_id => 2, :product_id => 3},
{:customer_id => 2, :order_id => 2, :product_id => 4},
])
products = Product.create([
{:description => 'teddy bear', :item_price => 19.95},
{:description => 'doll', :item_price => 24.00},
{:description => 'lego', :item_price => 16.00},
{:description => 'toy truck', :item_price => 29.95},
{:description => 'crayons pk10', :item_price => 17.90},
{:description => 'sketch pad', :item_price => 21.50},
{:description => 'football', :item_price => 10.55},
])
Затем в Rails консоли я загружая переменную со списком клиентов:
@customers = Customer.all
Когда я запускаю эту команду: @customers.find(1).orders
я правильно получить
Order id: 1, description: "description for order 1", customer_id: 1, created_at: "2014-01-02 02:51:36", updated_at: "2014-01-02 02:51:36">,
Order id: 4, description: "description for order 4", customer_id: 1, created_at: "2014-01-02 02:51:36", updated_at: "2014-01-02 02:51:36">]
Затем я хочу, чтобы запросить элементы внутри каждого заказа. Для простоты скажем Я хочу найти продукты в заказе 1, для клиента 1.
Я попробовал этот запрос: @customers.find(1).orders.find(1).order_products
, но я получаю этот результат:
OrderProduct id: 1, customer_id: 1, order_id: 1, product_id: 1, created_at: "2014-01-02 02:51:36", updated_at: "2014-01-02 02:51:36">,
OrderProduct id: 2, customer_id: 1, order_id: 1, product_id: 2, created_at: "2014-01-02 02:51:36", updated_at: "2014-01-02 02:51:36">,
OrderProduct id: 6, customer_id: 2, order_id: 1, product_id: 5, created_at: "2014-01-02 02:51:36", updated_at: "2014-01-02 02:51:36">,
OrderProduct id: 7, customer_id: 2, order_id: 1, product_id: 6, created_at: "2014-01-02 02:51:36", updated_at: "2014-01-02 02:51:36">
Похоже, он возвращает результаты для orders.find(1).order_products
части запроса, так как все результаты order_id: 1
. Проблема состоит в том, что этот набор результатов включает результаты для customer_id: 1
и 2
.
То, что я действительно хочу видеть, это продукты в пределах order 1
, для customer 1
. Можете ли вы помочь мне понять правильный запрос, который мне нужен?
Похоже, что у вас есть некоторые проблемы с данными вашего семени. Я разместил решение, которое предлагает 1) исправление как есть, и 2) способ исправить семенные данные, чтобы ваш исходный запрос работал. – zeantsoi