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

时间:2012-08-23 22:28:14

标签: ruby-on-rails

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

我有一个执行此操作的控制器

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

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

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

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

1 个答案:

答案 0 :(得分:2)

好吧,就像大多数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)