문제

named_scope 내에 "find_by_sql"을 사용하는 방법이 있는지 궁금합니다. Custom SQL을 named_scope로 취급하여 기존의 이름의 _scopes에 체인 할 수 있습니다. 또한 자주 사용하는 SQL 스 니펫을 최적화하는 데 좋습니다.

도움이 되었습니까?

해결책

이름이 지정된 범위의 조건에서 원하는 SQL을 넣을 수 있지만 전화하면 find_by_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, 등은 모두 독특한 조각으로 나뉩니다. Rails는 다른 모든 것에 영향을 미치지 않고 조건에 물건을 추가 할 수 있다는 것을 알고 있습니다 (이것은 with_scope 그리고 named_scope 일하다).

와 함께 find_by_sql 그러나 레일에 큰 끈을 제공합니다. 그것은 어디로 가는지 알지 못하므로 스코프가 작동하기 위해 추가해야 할 것들을 추가하는 것이 안전하지 않습니다.

다른 팁

이것은 당신이 요청한 내용을 정확히 다루지 않지만 'deNcruct_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'"
}

확실하지 않은 이유

: named_scope : 조건 => [SQL

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top