在rails 3.0中使用命名范围

时间:2011-11-02 04:55:14

标签: ruby-on-rails ruby

我最近参加过Rails课程。我们的任务是在“产品”模型中创建三个命名范围。我做了:

  scope :books,  where( :category => 'books')
  scope :movies, where( :category => 'movies')
  scope :music,  where( :category => 'music')

当我从命令行将这些称为“Product.books”或“Product.movi​​es”时,我希望看到我的所有产品(书籍或电影)都归还。我得到的只是一个空数组[]。范围定义中的问题(我假设),或者我是如何尝试访问它们的?

3 个答案:

答案 0 :(得分:1)

您的语法是正确的。但首先检查您的数据库,可能是您没有与Product.booksProduct.movies相关的数据。

答案 1 :(得分:1)

你的语法还可以。我通过添加一些书籍和电影来尝试它。当我运行Product.books时,它运行良好并且显示书籍。

所以,你的问题是空数据库,导致空数组。

答案 2 :(得分:1)

Category自己的模型是否与Product相关(例如has_many或has_one)?

如果是这种情况,您需要使用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

在这个简单示例中,ProductCategory只有name个属性作为字符串(在迁移中),Category也有product_id。