2008-09-17 4 views
8

일부 이름 목록에서 created_on> = some date AND name의 조합으로 레코드를 찾고 싶습니다.ActiveRecord 찾기 조건 조합

"> ="의 경우 SQL 조건을 사용해야합니다. "IN"의 경우 키가있는 조건의 해시를 사용해야합니다. 이름은 값의 배열입니다.

둘을 결합하는 방법이 있습니까?

답변

26

당신은 다음

Test.created_after_2005.named_fred 

을 할 수있는 레일 2.1과

Class Test < ActiveRecord::Base 
    named_scope :created_after_2005, :conditions => "created_on > 2005-01-01" 
    named_scope :named_fred, :conditions => { :name => "fred"} 
end 

위에 언급 된 범위를 사용할 수 있습니다 또는 당신은 당신이 인수를 전달 할 수 있도록 람다를 named_scope 줄 수

Class Test < ActiveRecord::Base 
    named_scope :created_after, lambda { |date| {:conditions => ["created_on > ?", date]} } 
    named_scope :named, lambda { |name| {:conditions => {:name => name}} } 
end 

다음 할 수 있습니다

당신이 람다를 사용할 필요가 귀하의 범위에 변수를 전달하기 위하여려고하는 경우에 named_scopes에 대한 자세한 내용은
Test.created_after(Time.now-1.year).named("fred") 
1

Ryan's announcement 볼 수 있고 Railscast on named_scopes

class Person < ActiveRecord::Base 
    named_scope :registered, lambda { |time_ago| { :conditions => ['created_at > ?', time_ago] } } 
    named_scope :with_names, lambda { |names| { :conditions => { :names => names } } } 
end 

.

0

이미 제안 된 명명 된 스코프는 꽤 괜찮습니다. 그것을 할 수있는 CLASIC 방법은 다음과 같습니다

names = ["dave", "jerry", "mike"] 
date = DateTime.now 
Person.find(:all, :conidtions => ["created_at > ? AND name IN ?", date, names]) 
7

당신이 이전 버전의 레일을 사용하는 경우, Honza의 쿼리는 가까운,하지만 당신은 IN 조건에 배치받을 문자열 괄호를 추가해야합니다

IN을 사용하면 혼합 식 가방이 될 수 있습니다. 정수는 가장 빠르며 문자열 목록은 가장 느립니다. 당신은 단지 하나의 이름을 사용하여 자신을 발견 할 경우, 확실히 연산자와 동일한 사용

Person.find(:all, :conditions => ["created_at > ? AND name = ?", date, name]) 
0

내가 하나 간단한 AR 측정기 또는 Searchgasm를 사용하는 것 같네요.

2

named_scopes에 대한 좋은 점은 너무 컬렉션에서 작동한다는 것입니다 :

class Post < ActiveRecord::Base 
    named_scope :published, :conditions => {:status => 'published'} 
end 

@post = Post.published 

@posts = current_user.posts.published 
1

할 수 있습니다 체인 where 절 :

Person.where(name: ['foo', 'bar', 'baz']).where('id >= ?', 42).first

관련 문제