为什么这种类似于作用域的查询方法不能使用拒绝?

马修·鲍兹克(Matthew Pautzke)

根据Rails文档中的scope,范围如下:

class Shirt < ActiveRecord::Base
    scope :red, -> { where(color: 'red') }
end

确实是:

class Shirt < ActiveRecord::Base
    def self.red
        where(color: 'red')
    end
end

他们还说,该关系应充当Array,因此请执行以下操作

Shirt.red.each(&block)

应该可以工作...而且确实可以。

使用上面我们知道的一切,为什么以下操作不起作用?

class Shirt < ActiveRecord::Base
    def self.short_sleeved
        reject{|object| object.short_sleeved == false}
    end
end

Shirt.red.short_sleeved 结果是 undefined method 'reject' for #<Class:0xba552d4>

戴夫·斯威斯古斯(Dave Schweisguth)

您无法short_sleeved按照尝试的方式定义方法,因为ActiveRecord类不是ActiveRecord关系。

short_sleeved在上定义ShirtShirt是一个ActiveRecord模型类。它本身不是ActiveRecord关系。它具有的方法包括allwhere和其他许多返回ActiveRecord关系的方法。

Shirt.class
=> Class
Shirt.respond_to? :each
=> false
Shirt.respond_to? :reject
=> false

像内置查询方法一样,作用域返回ActiveRecord关系。ActiveRecord关系具有动态生成的类。它不是一个Enumerable但对Enumerable方法的响应

red_shirts = Shirt.red
red_shirts.class
=> Shirt::ActiveRecord_Relation
red_shirts.respond_to? :each
=> true
red_shirts.respond_to? :reject
=> true

因此,您可以通过以下方式编写方法:

def self.short_sleeved
  all.reject { |object| object.short_sleeved == false }
end

但是,这会Shirt从数据库中加载所有s,然后将其过滤到内存中,对于大量Shirts而言,效率where不如MZaragosa建议的那样在数据库中进行过滤你可以这样

def self.short_sleeved
  where short_sleeved: true
end

或者

scope :short_sleeved, -> { where short_sleeved: true }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么lambda不能使用这种匿名方法?

来自分类Dev

为什么我不能使功能方法起作用?

来自分类Dev

为什么我的查询不能使用 ActiveRecord?

来自分类Dev

为什么在这种情况下不能使用隐式?

来自分类Dev

为什么我不能使用私有抽象方法?

来自分类Dev

为什么我不能使用makeRange方法

来自分类Dev

为什么不能使用上下文无关的语法来定义类似XML的元素?

来自分类Dev

为什么不能以这种[...]。append(...)的方式使用append()方法?

来自分类Dev

为什么我的SQLite查询方法返回错误?

来自分类Dev

为什么 Fragmenttransaction replace() 的作用类似于 add()?

来自分类Dev

为什么PoolManager不能使用HTTPSConnectionPool?

来自分类Dev

为什么不能使用这样的struct?

来自分类Dev

为什么ckan不能使用中文?

来自分类Dev

为什么我不能使用asyncTask

来自分类Dev

为什么不能使用下拉列表?

来自分类Dev

rpm为什么不能使用xterm?

来自分类Dev

为什么不能使用Override注释?

来自分类Dev

为什么不能使用HTTP代理?

来自分类Dev

为什么ckan不能使用中文?

来自分类Dev

为什么是未定义这种类型我的方法?

来自分类Dev

Java作用域构造不能使用类型注释

来自分类Dev

为什么我不能使用python查询Influxdbv2数据?

来自分类Dev

REST为什么我们不能使用字符作为查询参数

来自分类Dev

为什么没有类似于Monitor.EnterAsync的方法

来自分类Dev

为什么我们不能使用动态方法代替Generic(T)方法

来自分类Dev

为什么这种类型的守护程序不能处理字符串?

来自分类Dev

我不明白为什么Haskell不能推论出这种类型

来自分类Dev

Ruby on Rails-为什么不能使用ActiveRecord :: Base方法?在哪里使用?

来自分类Dev

为什么会发生这种情况,所以res.redirect()方法的作用域仅限于express中的findByIdAndRemove方法

Related 相关文章

  1. 1

    为什么lambda不能使用这种匿名方法?

  2. 2

    为什么我不能使功能方法起作用?

  3. 3

    为什么我的查询不能使用 ActiveRecord?

  4. 4

    为什么在这种情况下不能使用隐式?

  5. 5

    为什么我不能使用私有抽象方法?

  6. 6

    为什么我不能使用makeRange方法

  7. 7

    为什么不能使用上下文无关的语法来定义类似XML的元素?

  8. 8

    为什么不能以这种[...]。append(...)的方式使用append()方法?

  9. 9

    为什么我的SQLite查询方法返回错误?

  10. 10

    为什么 Fragmenttransaction replace() 的作用类似于 add()?

  11. 11

    为什么PoolManager不能使用HTTPSConnectionPool?

  12. 12

    为什么不能使用这样的struct?

  13. 13

    为什么ckan不能使用中文?

  14. 14

    为什么我不能使用asyncTask

  15. 15

    为什么不能使用下拉列表?

  16. 16

    rpm为什么不能使用xterm?

  17. 17

    为什么不能使用Override注释?

  18. 18

    为什么不能使用HTTP代理?

  19. 19

    为什么ckan不能使用中文?

  20. 20

    为什么是未定义这种类型我的方法?

  21. 21

    Java作用域构造不能使用类型注释

  22. 22

    为什么我不能使用python查询Influxdbv2数据?

  23. 23

    REST为什么我们不能使用字符作为查询参数

  24. 24

    为什么没有类似于Monitor.EnterAsync的方法

  25. 25

    为什么我们不能使用动态方法代替Generic(T)方法

  26. 26

    为什么这种类型的守护程序不能处理字符串?

  27. 27

    我不明白为什么Haskell不能推论出这种类型

  28. 28

    Ruby on Rails-为什么不能使用ActiveRecord :: Base方法?在哪里使用?

  29. 29

    为什么会发生这种情况,所以res.redirect()方法的作用域仅限于express中的findByIdAndRemove方法

热门标签

归档