Rails 分享一下关于 Active Model scope 的小发现

lilu · 2012年03月17日 · 最后由 vkill 回复于 2012年03月17日 · 3262 次阅读

有时候使用 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' %>

没看明白。

莫非你指的是 scoped , 这个确实比较常用

不错,很有启发,就是写法比较奇葩,那应该是 lambda。

举个实际的例子吧,在什么情况下?

补充修改了一下

这个的话我可能会

User has_many :photos
User has_many :texts


需要 登录 后方可回复, 如果你还没有账号请 注册新账号