2

我的应用程序中有四个模型,定义如下

class User < ActiveRecord::Base
    has_many :comments
    has_many :geographies
    has_many :communities, through: :geographies

class Comment < ActiveRecord::Base
    belongs_to :user

class Community < ActiveRecord::Base
    has_many :geographies
    has_many :users

class Geography < ActiveRecord::Base
    belongs_to :user
    belongs_to :community

用户可以发表评论,这些评论通过地理表与一个或多个社区相关联。

我的任务是仅显示从下拉列表中选择的社区的评论。我从这篇文章comment.user.communities.first中了解到,我可以通过对象链访问给定评论的社区。

似乎通常带有 lambda 的 named_scope 将是过滤所有评论列表的首选,但是,我完全不知道如何构造这个 named_scope。我试图通过遵循一些 RailsCasts 来构建 named_scope,但这是我所能得到的。生成的错误如下。

class Comment < ActiveRecord::Base
    belongs_to :user

    def self.community_search(community_id)
        if community_id
            c = user.communities.first
            where('c.id = ?', community_id)
        else 
            scoped
        end
    end

    named_scope :from_community, { |*args| { community_search(args.first) } }

这是错误:

syntax error, unexpected '}', expecting tASSOC
named_scope :from_community, lambda { |*args|  { community_search(args.first) } }
                                                            ^

将带有参数的方法传递到 named_scope 的正确语法是什么?

4

1 回答 1

5

首先,您scope现在可以在 rails 3 中使用 - 旧named_scope形式已缩短,并且在 rails 3.1 中已删除!

但是,关于您的错误,我怀疑您不需要内部括号。当使用这样的 lambda 块时,它们通常会加倍,因为您正在从头开始创建新的哈希,如下所示:

scope :foo, { |bar|
  { :key => "was passed #{bar}" }
}

但是,在您的情况下,您正在调用community_search它应该返回一个您可以直接返回的值。在这种情况下,一个AREL对象已经取代了这种简单的哈希值。阅读有关该主题的所有随机帖子和教程时,这有点令人困惑,这主要是由于 AREL 导致的风格发生了巨大变化。不过,这两种风格的使用都可以 - 作为 lambda 或类方法。它们在很大程度上意味着同样的事情。上面的两个链接有几个这种新风格的例子,供进一步阅读。

当然,您可以只学习squeel 之类的东西,我觉得它更容易阅读,并且省去了很多打字。^^;

于 2012-07-03T03:33:08.740 回答