Проблемы с ассоциациями моделей Rails - PullRequest
0 голосов
/ 29 октября 2018

У меня есть таблица корзины и товаров, связанная с ними, но когда я запрашиваю таблицу корзины и включает в себя таблицу товаров. Он запрашивает таблицу товаров с идентификатором корзины вместо items_id.

Ниже мой код:

Миграция:

class Carts < ActiveRecord::Migration[5.1]
  def change
    create_table :carts do |t|
      t.references :user, foreign_key: true
   t.references :items, foreign_key: true,
     t.timestamps
   end
  end
end

Модель:

class Cart < ApplicationRecord
  belongs_to :user
 has_many :items, :foreign_key => "id"
end

Контроллер:

def index
        @items = Cart.includes(:items).where(user_id: current_user.id)
end

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

У вас есть ассоциации в обратном направлении. Чтобы установить связь «один ко многим» между тележками и товарами, вам нужно поместить внешний ключ в таблицу предметов, а не тележки, так как это позволит связать 1-1. references просто создает целочисленный столбец, который может содержать один идентификатор.

Db design sketch

Вы можете создать правильные миграции с помощью rails g model cart user:references и rails g model item cart:references. Если просто откат и повторение не возможны, вам нужно написать миграцию, чтобы добавить cart_id в таблицу items и удалить items_id из таблицы carts.

class Cart < ApplicationRecord
  belongs_to :user
  has_many :items # references items.cart_id
end

class Item < ApplicationRecord
  belongs_to :cart # items.cart_id
end

class User
  has_many :carts
  has_many :items, through: :carts
end

Хотя для создания типичного интернет-магазина вам нужны три таблицы:

Typical web shop db schema

class Cart < ApplicationController
  has_many :line_items
  has_many :products, though: :line_items
end

class LineItem < ApplicationController
  belongs_to :cart
  belongs_to :product
end

class Product < ApplicationController
  has_many :line_items
  has_many :carts, though: :line_items
end
0 голосов
/ 29 октября 2018

Если я правильно понимаю, что вам нужны элементы по пользователю и корзине, значит, ваш код неверен, и я думаю, вы неправильно поняли ActiveRecord .includes.

Вы запрашиваете Cart по user_id в:

@items = Cart.includes(:items).where(user_id: current_user.id)

Здесь .includes позволяет только получить доступ к элементам модели Cart без запуска дополнительного запроса

Чтобы получить предметы, вам необходимо:

 # With know cart id
 @items = Item.where(cart_id: cart_id)

 # With only user id (for example)
 # Querying all items where cart have current user id
 @items = Item.join(:cart).where(carts: { user_id: current_user.id })

Активная запись. Включает документацию

Активная запись. Присоединяется к документации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...