2012-03-14 2 views
3

Arel # 추출 방법을 사용하려고합니다. 나는 소스에서 test_extract.rb의 테스트 케이스에서 예제를 보았지만 애플 리케이션에서이를 재현하려고 할 때 정의되지 않은 메소드를 얻는다.레일에서 Arel # 추출 방법은 어떻게 사용됩니까?

table = Arel::Table.new :users 
puts table[:created_at].extract('hour').to_sql 
=> NoMethodError: undefined method `extract' for #<Arel::Attributes::Attribute:0x7..8> 

데이터베이스로 pg를 사용하고 있습니다.

업데이트 : 내 목표는 SQL에서이 결과로 끝날 것입니다

:

SELECT users.* FROM users WHERE EXTRACT(HOUR from users."created_at") = '1' 

내가 어떤 일 중 하나에 동일한 시간에 생성 된 모든 사용자를 찾을 싶습니다 . 이것은 SQL에서 작동하지만 arel에서 만드는 방법을 궁금합니다. 여기에 arel 테스트 스위트에서 사용되는 방법은 example입니다.

+0

문서에서 Arel :: Table 클래스의 일부로'# extract'가 표시되지 않습니다. 너 뭐하려고? 테이블에서''date ''를 검색 하시겠습니까? – ScottJShea

+0

귀하의 질문에 대한 답변을 업데이트했습니다. –

+0

ActiveRecord 쿼리가 더 잘 작동할까요? 'Users.where ("Minute (?) = 1", : created_at) .all'? – ScottJShea

답변

1

추출은 노드의 메서드이므로 Arel :: Table 인스턴스가 아닌 모든 열 (예 : 사용자 [: id])에 캐스팅 할 수 있습니다.

따라서, 쿼리를 구성 요소가 필요합니다

  • 이 Arel을 얻을 :: 표 예를 users = Arel::Table.new(:users)하거나 액티브 사용하는 경우 - Arel에 users = User.arel_table
  • 설정 SELECT 문 :: project 방법으로 표 예 : users = users.project(Arel.sql('*'))
  • 세트 WHERE where 방법 문 : users.where(users[:created_at].extract(:hour).eq(1))

한 블록에서 : 나는 Arel :: 노드 :: NamedFunction (Arel 6.0 기준) 메소드 #extract을 노출하지 않습니다 인스턴스에서 추출 DOW을 수행 했어

query = User.arel_table. 
      project(Arel.sql('*')). 
      where(users[:created_at].extract(:hour).eq(1)) 
users = User.find_by_sql(query) 
# => "SELECT * FROM \"users\" WHERE EXTRACT(HOUR FROM \"users\".\"created_at\") = 1" 
0

. 나는 수동으로 Arel::Nodes::Extract의 인스턴스를 생성하여이를 달성 할 수있었습니다.

Arel::Nodes::Extract.new( Arel::Nodes::NamedFunction.new('some_function_name', [param1, param2, ...]), :dow )

당신은 액티브의 #where 대신 알렉산더 kärmes 팀의 대답에 의해 예시 된 바와 같이 Arel을 통해 전체 쿼리를 구축하여 직접 Arel 노드를 사용할 수 있습니다 여기에 경우 누군가가 비슷한 문제가에, 나를 위해 일한 것입니다. 산출

User.where( Arel::Nodes::Extract.new(User.arel_table[:created_at], :hour).eq(1) )

:

SELECT "users".* FROM "users" WHERE EXTRACT(HOUR FROM "users"."created_at") = 1

을 당신이 당신의 User 모델에 정의 된 다른 범위 체인 유지할 수있는 추가 혜택과 함께 그래서 여기에 대한 대답에서 필요로하는 쿼리를 수행하는 또 다른 방법입니다 .