Использование именованных областей в rails 3.0

#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 в своей области, но это не имело никакого значения.