2011-03-27 3 views
0

I가 다음과 같은 모델 객체 : Issue.owner = [array]라는 이름의 범위 구문

나는 이와 같은 범위가 특정 정수의 배열을 검색 범위, 만들려고 해요 :이

scope :tagged_in_issue, where("issues.owner.include?(1)", true) 

을 내가 잘못 갔어?

+0

당신이 소유자 필드를 원하십니까 저장 않는다 어디에서나 "1"을 가졌거나 단지 "1"일까요? 소유자가 Ruby 관련 필드 (owner_id) 또는 단순한 정수 필드 (owner)입니까? 범위 : tagged_in_issue, 여기 ("issues.owner =?", 1) –

+0

"Cross Model Scopes"섹션을 참조하십시오. http://edgerails.info/articles/what-s-new-in-edge- rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html을 참조하십시오. 당신이 정말로하고 싶은 것은 그 같은 JOIN을 만드는 것입니다. – scragz

+0

이 범위는 무엇에 정의되어 있습니까? 문제 표의 소유자 열에있는 값 중 하나가 어떻게 생깁니 까? 정수의 직렬화 된 루비 배열 인 경우 특정 쿼리가 필요합니다. 그 사이에 조인 모델이 있다면 다른 쿼리가 필요합니다. –

답변

1

는이 같은 방법을 추가 할 수 있습니다 : 지금까지

class Issue < AR::Base 
    def tagged_in_issue?(n) 
    owner.include?(n) 
    end 
end 

@issue.tagged_in_issue(1) 
#=> true 
@issue.tagged_in_issue(2) 
#=> false 

UPD

을 내 접근 방식은 당신이 필요로하는 것이 아닙니다 scope을 필요로한다. 그래서 당신은 당신이 SQL을 통해 그것을하고 싶은 경우 (루비 방법)

class Issue < AR::Base 
    def self.tagged_in_issue(n) 
    all.select{|a| a.owner.include?(n)} 
    end 
end 

Issue.tagged_in_issue(1) 
#=> Array of issues 

이런 식으로 할 수있는, 그래서 당신은 속성이 무엇인지 owner 설명해야하고 어디는

+0

영리하고 훌륭하게 부름. 이것은 또한 작동합니다. –

+1

얼마나 많은 문제점을 가지고 있느냐에 따라, 전체 데이터베이스를 덤프하고 모든 데이터베이스를 루프하는 것은 매우 비효율적 일 수 있습니다. – scragz

+0

@scragz, +1. 그러나 JZ는 우리에게'owner' 자연에 대한 정보를주지 않았습니다. – fl00r

1

Ruby가 SQL을 필요로하는 곳에서는 Ruby를 사용할 수 없습니다. where 절에 대한 매개 변수는 리터럴 문자열, 자리 표시자가있는 배열 또는 열 값 쌍이있는 해시와 같은 SQL에서 사용할 수있는 것이어야합니다.

당신이해야 할 일은 쿼리를 SQL WHERE 절로 다시 사용하는 것입니다.

+0

잘 난 곤경에 처해있다. 하하. 어떻게 정수 1에 대한 SQL 배열을 검색합니까? –

+0

배열이란 무엇입니까? SQL에는 실제로 이러한 것이 없습니다. 결과 집합을 가지고 있습니다. 어쩌면 당신이 원하는 것은'issues.where (: owner_id => 1)'입니다 만,'serialize' 컬럼은 SQL이 이해할 수없는 형식으로 저장되어 있기 때문에 이것을 사용하면 작동하지 않을 것입니다. – tadman

관련 문제