0

已经与 RoR 合作了一段时间,我找到了一种过滤查询结果的方法,但我不确定我做得对。就像在任何新的语言/技术中一样,你变成了一个孩子的脚本,我不喜欢它。

我有一个控制器可以做到这一点

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

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

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

我从一个例子中想出了这段代码,但我仍然几乎无法理解它。有人能告诉我一点 Ruby 魔法在这种情况下是如何工作的吗?

4

1 回答 1

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_id3

@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)
于 2012-08-23T22:56:27.670 回答