#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
Недавно я проходил курс по Rails. Нам поручено создать три именованные области в нашей модели «Продукта». Я сделал:
scope :books, where( :category => 'books')
scope :movies, where( :category => 'movies')
scope :music, where( :category => 'music')
Когда я вызываю их как ‘Product.books’ или ‘Product.movies’ из командной строки, я ожидаю увидеть возврат всех моих продуктов, которые являются книгами или фильмами. Все, что я получаю, это пустой массив [] . Проблема в определении областей (которые я предполагаю) или в том, как я пытаюсь получить к ним доступ?
Комментарии:
1. возвращает ли Product.where(:category => «Music») объекты продукта с категорией music ??
2. Если это так, то я думаю, что scope :music, где( :category => ‘Music’) также должен возвращать объект при выполнении Product.music
Ответ №1:
Ваш синтаксис в порядке. Я попробовал это, добавив несколько книг и фильмов.Он работал нормально и отображал книги, когда я запускал Product.books.
Итак, ваша проблема — пустая база данных, которая приводит к пустому массиву.
Комментарии:
1. Так почему же, когда я запускаю ‘Product. all’, я получаю возврат всех моих продуктов, но Product.books выдает пустой массив? Я вижу, когда запускаю Product.all, что в книге категорий есть три элемента.
2. Попробуйте Product.first .. Мне кажется, что у вас есть категория-> книга, но в области видимости вы используете категорию-> книги
3. Попробовал Product.first и вернул мой первый продукт. Там написано, что категория товара: «Книги».
4. Итак, проблема, похоже, связана с КОРПУСОМ .. что вам нужно сделать сейчас, это scope :books, где( :category => ‘Books’)
5. Извините, но разве это не то, что у меня уже есть? Или я что-то упускаю. Я здесь, и у меня немного мутные глаза. О, извините, я понимаю, что вы имеете в виду, я упомянул в нижнем сообщении, что я изменил исходный код, так что теперь он читает scope :books, где( :category => ‘Books’) и все равно ничего не получает. Очень ценю, что вы поддерживаете меня в этом. Спасибо.
Ответ №2:
Связана ли Category
его собственная модель с Product
(например, с помощью has_many или has_one)?
Если это так, вам нужно будет выполнить a joins
с помощью Category
Например, смотрите следующий код:
class Product < ActiveRecord::Base
has_one :category
scope :books, joins(:category).where('categories.name' => 'book')
end
class Category < ActiveRecord::Base
belongs_to :product
end
В этом простом примере оба Product
и Category
только имеют name
атрибуты в виде строк (в миграциях), а Category
также имеют product_id .
Комментарии:
1. Категория — это столбец в таблице БД с заголовком, описанием и т.д. У него нет собственной модели.
Ответ №3:
Ваш синтаксис правильный. Но сначала проверьте свою базу данных, возможно, у вас нет данных, связанных с Product.books
или Product.movies
.
Комментарии:
1. Это полезно знать. У меня есть книги и фильмы, даже музыка, если на то пошло. Только что проверил с помощью Product.all, и там определенно есть книги, музыка и фильмы (простите за плохой английский, там много «и»). Я думал, что это может быть проблемой, что я использовал книги верхнего регистра в БД и l / c в своей области, но это не имело никакого значения.