2

私のアプリケーションには、次のように定義された 4 つのモデルがあります。

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

ユーザーは、geography テーブルを介して 1 つ以上のコミュニティに関連付けられたコメントを投稿できます。

私のタスクは、ドロップダウン リストから選択したコミュニティからのコメントのみを表示することです。この投稿comment.user.communities.firstから、オブジェクト チェーンを介して特定のコメントのコミュニティにアクセスできることを知りました。

通常、ラムダを使用したnamed_scopeは、すべてのコメントのリストをフィルタリングするための推奨される選択肢のようですが、このnamed_scopeを構築する方法を完全に失っています。いくつかのRailsCastをたどって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

まず、Rails 3 で使用できるようscopeになりました。古いnamed_scope形式は短縮され、Rails 3.1では削除されました。

ただし、エラーに関しては、ブラケットの内側のセットは必要ないと思います。次のように、新しいハッシュを最初から作成しているため、そのようなラムダブロックを使用すると、通常2倍になります。

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

ただし、あなたの場合、community_search直接返すことができる値を返す必要がある呼び出しを行っています。この場合、そのような単純なハッシュを置き換えたARELオブジェクトです。主に AREL によってスタイルが大幅に変更されたため、このテーマに関するランダムな投稿やチュートリアルをすべて読むと、やや混乱します。ただし、これらのスタイルの使用はどちらも問題ありません-ラムダまたはクラスメソッドとして。それらはほとんど同じことを意味します。上記の 2 つのリンクには、この新しいスタイルの例がいくつかあります。

もちろん、squeelのようなものを学ぶこともできます。これは読みやすく、多くのタイピングを省略できます。^^;

于 2012-07-03T03:33:08.740 に答える