我一直在使用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魔法如何适用于这种情况?
答案 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)