2011-08-13 4 views
5

Foo has_many Bar。それはbars関係で利用できるように、私はfind_with_custom_stuffを定義するにはどうすればよいActiveRecordリレーションにカスタムファインダメソッドを定義しますか?

foo_instance.bars.find_with_custom_stuff(baz) 

:私のような何かをしたいですか? (だけでなくBarクラスメソッド?)

更新

私はスコープよりも複雑な何かをしたいです。以下のようなもの:レール

class Bar 
    scope :custom_find, lambda {|baz| where(:whatever => baz) } 
end 

foo_instance.bars.custom_find(baz) 

scope 2.スコープを返すべきで

def find_with_custom_stuff(thing) 
    if relation.find_by_pineapple(thing) 
    relation.find_by_pineapple(thing).monkey 
    else 
    :banana 
    end 
end 
+1

スコープ。 – rubish

+0

私が追加したいものは、スコープよりはるかに複雑です。 –

+0

あなたは範囲で複雑なものをたくさんすることができます、あなたは精巧にできますか? – numbers1311407

答えて

5

スコープ、レール3内scopenamed_scopeは、そうあなたはおそらくここscopeを使用したくないあなたの更新を与えられました。あなたはしかし、クラスのメソッドを記述し、同様に、現在のスコープにアクセスするためにscopedを使用することができます。ここで使用可能になりますバーの

class Bar 
    def self.custom_find(thing) 
    if bar = scoped.find_by_pineapple(thing) 
     bar.monkey 
    else 
     :banana 
    end 
    end 
end 
+0

OIC。大丈夫、スコープです。 –

+0

@John Bachir:おそらくレコードを見つけて、それが期待を破るので、レコードを取得するメソッドを作成したくないでしょう。現実的な例を少し使用すると、これは理解しやすくなります。 'Post.find_tag( 'john')'を考えてみましょう。それが何を返し、何が起こっているのですか?本当に 'Post.find_by_author_name( 'john')だと思いますか?tags.first || 「タグなし」? – coreyward

+0

私は、すべての猿のビジネスは、いわば、そのポイントを説明するだけかもしれないと思いますか?例えばメソッドが 'first_monkey'またはそれに類するものであれば(そして、':banana'がピクチャから削除されました)、これは本当に期待を破るとは思わないでしょう。 (しかし、ええ、パイナップルで検索して猿を返すfind_by_custom_stuffというメソッドはおそらく最小の驚きの原則の限界を押しているでしょう:-P) – numbers1311407

関連する問題