繁体   English   中英

如何在RoR应用中过滤掉查询结果?

[英]How to filter out query results in RoR app?

一直在使用RoR,我找到了一种过滤查询结果的方法,但我不确定我做得对。 就像在任何新的语言/技术中一样,你成为一个孩子的脚本,我不喜欢它。

我有一个控制器来做到这一点

@events = Appointment.scoped
@events = @events.which_user(current_user.id)

然后,在Appointment模型中,我有这个代码只保留给定userid的约会:

scope :which_user, lambda {|user_id| {:conditions => ["user_id = ?", user_id]}}

我从一个例子中想出了这个代码,但我仍然几乎无法理解它。 有人可以告诉我一些Ruby魔法如何适用于这种情况?

好吧,就像大多数Ruby on Rails的东西一样,幕后有各种各样的魔法让它起作用,但基本上:

@events = Appointment.scoped

创建SQL查询的表示形式,但不执行它。 这使您可以在运行之前修改查询 - 如果需要 - 。 默认查询是选择表中所有行的所有字段。

scope :which_user, lambda {|user_id| {:conditions => ["user_id = ?", user_id]}}

定义向SQL查询添加条件(或排序或其他)的方法。 因此,如果您调用somequery.which_user(3) ,它将返回另一个具有somequery限制的查询,其中包含user_id必须等于3的附加限制。

@events = @events.which_user(current_user.id)

就是我上面提到的。 现在@events是一个查询,它将返回只有具有正确user_id的行的所有字段。

Rails魔术的最后一点是,当您使用它们时,这些查询会自动执行并转换为记录数组。 它的功能就像each触发这个的功能; 如果你想迭代你的记录,那么你需要一些实际的记录来迭代 - 所以Rails运行查询并将它们传递给你。

希望有所帮助! 如果我留下任何过于模糊的东西,请告诉我。

PS:还有默认的Rails的方法where ,这在一个非常类似的方式工作。 对于像这样的简单条件,它可能比使用scope更容易:

@events = Appointment.where(:user_id => current_user.id)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM