2008-09-26 3 views
9

named_scope에서 "find_by_sql"을 사용하는 방법이 있는지 궁금합니다. 나는 기존의 named_scopes에 연결할 수 있도록 named SQL을 named_scope로 취급하고 싶습니다. 또한 자주 사용하는 SQL 코드 조각을 최적화하는 것이 좋습니다.named_scope에서 SQL 캡슐화

답변

10

그런 다음 다음 '범위를 find_by_sql를 호출하는 경우 당신은 당신이 명명 된 범위의 조건에 원하는 SQL을 넣을 수 있지만 '버려져. 을 감안할 때

:

이 작동
class Item 
    # Anything you can put in an sql WHERE you can put here 
    named_scope :mine, :conditions=>'user_id = 12345 and IS_A_NINJA() = 1' 
end 

이 (그냥 거기에 SQL 문자열 스틱 - 두 개 이상의들이 합류 얻을 하나있는 경우) 그러나

Item.mine.find :all 
=> SELECT * FROM items WHERE ('user_id' = 887 and IS_A_NINJA() = 1) 

을,이하지 않습니다

Items.mine.find_by_sql 'select * from items limit 1' 
=> select * from items limit 1 

그래서 대답은 "아니오"입니다. 당신이 장면 뒤에서 일어날 일에 대해 생각한다면 이것은 많은 의미가 있습니다. SQL 레일을 구축하기 위해서는 함께 사용하는 방법을 알아야합니다.
일반 쿼리를 만들 때 select, joins, conditions 등은 모두 별개의 조각으로 나뉩니다. 레일스는 다른 모든 것에 영향을 미치지 않고 조건에 추가 할 수 있음을 알고 있습니다 (즉, with_scopenamed_scope의 작동 방식입니다).

그러나 find_by_sql으로 레일을 크게 줄 수 있습니다. 어디로 가는지 알지 못하기 때문에 범위가 작동하기 위해 추가해야 할 사항을 추가하는 것이 안전하지 않습니다.

0

있는지 왜 안

: named_scope : 조건 => [당신의 SQL]

1

이 질문에 대한 답변은 정확하지 않지만 'contruct_finder_sql'을 조사해보십시오. 그것은 당신이 명명 된 범위의 SQL을 얻을 수 있습니다.

named_scope :mine, :conditions=>'user_id = 12345 and IS_A_NINJA() = 1' 
named_scope :additional { 
    :condtions => mine.send(:construct_finder_sql,{}) + " additional = 'foo'" 
}