2012-03-16 4 views
3

나는 가면서 배우기도하지만 이걸 이해할 수는 없다. 현재 내 검색어는 모두 MyObject.find(various conditions)입니다. 이는 MyObject의 배열을 반환하며 대부분의 용도로 충분합니다. 하지만 지금은 select name, count(*) from MyObjects group by name order by 2과 같은 검색어로 가장 인기있는 항목의 목록을 만들고 싶습니다. 그것은 임의의 데이터 열을 반환 할 것이므로 MyObject을 반환하지 않습니다. 그러면 어떻게해야합니까? 당신은 항상 할 수Ruby on Rails에서 임의의 SQL 쿼리를 작성하려면 어떻게해야합니까?

+0

을 시도 할 수 있습니다. 조금 더 명확 할 수 있습니까? – Calvin

답변

0

:

MyObject.find_by_sql('query....') 

하지만 일반적으로 더 나은 방법이 있습니다.

5

MyObject.find_by_sql을 사용하면 문제를 해결할 수 있습니다. select 문에서 사용하는 추가 열은 반환 된 객체를 통해 평소와 같이 액세스 할 수 있습니다. 예 :

MyModelName.find_by_sql("select coulmn1, column2 as somenewname, 
    column3 as someothername from....") 

이렇게하면 somenewname 및 someothername이라는 속성이 각각있는 객체가 반환됩니다.

find_by_sql 메소드에 대한 자세한 내용은 설명서를 참조하십시오.

results = MyObject.select('name, count(*) as how_many') 
        .group(:name) 
        .order(:how_many) 

# And later... 
results.each do |o| 
    puts "#{o.name} has #{o.how_many}" 
end 

은 그래서 당신은 SQL에 의존 할 필요가 없습니다 :

+0

그리고 고마워, 그게 내가 찾던 줄 알았지 만, find_by_sql이 내 목적에 맞는 것 같아. – Kundan

2

당신은 표준 액티브 쿼리 인터페이스를 통해 그 같은 간단한 일을 할 수 있습니다.

SQL 쿼리를 사용하여 SQL 쿼리를 기반으로 모델 개체 집합을 인스턴스화하려는 경우 다른 사람이 언급 한 것처럼 find_by_sql도 있습니다.

여러 테이블의 데이터를 수집하거나 AR이 좋지 않은 (subselects, derived table ... 등) SQL 쿼리가있는 경우 ActiveRecord를 밀어 넣고 직접 대화 할 수 있습니다 데이터베이스 : 또한 당신이 바로 JSON (또는 유사) 데이터의 큰 더미를 인코딩하는 경우 유용하고, 액티브의 미묘한 필요가 없으며 처리를 지불하지 않을 수 select_rows를 사용

connection.select_rows('some big pile of sql').each do |r| 
    # r will be an array of strings so you have to pull 
    # it apart and sort out the types by hand 
end 

ActiveRecord를 사용하여 오버 헤드.

0

당신은 액티브 레코드와 해 드리겠습니다 같은 소리 ORM 방향

MyObject.select(:name, "count(*) as count").group(...).order(...) 
관련 문제