有时候使用 scope 时,需要生成一个什么都不做的 scope 以方便链式方法调用
这时可以用 scoped 方法生成:
scope :by_type, ->(type) do
type ? where(_type: type) : scoped
end
对不起,补充解释一下我应用的环境,如果 @huachlee 都说没明白,那就是我说的太有问题
假设 ruby china 有两种帖子,Photo 和 Text,那么基于 mongoid,我的实现是这样的
class Topic
include Mongoid::Document
end
class Photo < Topic
end
class Text < Topic
end
然后,这时候我们的需要是,使用统一的 api 在任何 topics 列表中过滤出 photos 或 texts, 比如
user.topics.by_type(“Photo").page(1)
forum.topics.by_type(“Photo").desc("replied_at")
user.commented_topics.by_type(“Photo")
我们可以使用 scope,但是有些时候,这个列表不需要过滤,比如你有可能需要所有的 posts,而不是只有 photos,这时候就绪要给 by_type 传递参数了,可以用到最前边提的方法。
最后一个小小的个人产品建议,希望在 "topics#edit" 中也能看到
<%= render 'sidebar_for_new_topic' %>