2011-08-31 7 views
1

두 개의 테이블 (토론, 교환)에서 모든 항목을 반환하는 내 사용자 모델에 피드라는 메서드를 갖고 싶습니다. User.rb루비 방법으로 SQL을 작성하는 방법은 무엇입니까?

def feed 
    SELECT * FROM discussions, exchanges GROUP BY created_at 
end 

이 작동하지 않습니다에서

, 내가 레일 콘솔에서 문제를 얻을

syntax error, unexpected ';', expecting '=' 

사람이 어떻게 여기에 SQL을 작성하는 저를 보여줄 수 있습니까? 당신이 실제 액티브 당신이 시도 할 수 개체를 원하는 경우 기본적으로 내가 ..

+0

을 필요로하는 곳에 사용 성명서. – Andrey

답변

2

을 반환하고 두 개의 서로 다른 테이블에서 항목을 정렬 할 다음

def feed 
    exchanges = Exchange.all 
    discussions = Discussion.all 

    (exchanges + discussions).sort! { |a, b| a.created_at <=> b.created_at } 
end 

정렬은 SQL에서 할 수 있기 때문에 이것은 매우 비효율적이다, 하지만 ActiveRecord는 다른 테이블에서 선택된 레코드를 인스턴스화 할 수 없습니다. (STI를 사용하여 이것을 어떻게 든 재정의 할 수 있습니다)

+0

감사합니다 - 좋은 하루 – jay

2

첫째, 루비 코드에 일반 SQL을 작성하고 작동 할 수 없습니다.

SQL이 아닌 루비입니다. 그들은 다른 언어입니다. - 할 수있는 경우 - (다른 예제에 따라) 연결과 함께 루비 웨이를 사용하십시오.

그러나 원시 SQL을 필사적으로 사용해야하는 경우 (예 : 모델과 일치하지 않거나 일부 조합 논리가 SQL에 쉽게 포함되지 않음); SQL을 데이터베이스에 전달해야합니다 ... 이는 활성 레코드를 통해 연결을 사용한다는 것을 의미합니다.

시도 :

def feed 
    ActiveRecord::Base.connection.execute("SELECT * FROM discussions, exchanges GROUP BY created_at") 
end 

그것은 당신을 위해 루비 모델을 반환하지 않습니다 - 단지 원시 결과 객체. 스크립트/콘솔에서이 작업을 시도한 다음 "puts my_user.feed.inspect"를 실행하여 반환하는 항목을 살펴보고 사용법을 알고 싶습니다.

참고 : 이런 종류의 존재는 강력한 코드 냄새 간주됩니다 - 만 정말 당신은 적절한 SQL을 쓸 수 있도록 테이블 '필드를 제공해야

+0

:)을 가지고 있지만 아직 코드에서 시도했습니다 ... 그리고 그 이유는 내가 대답하고 그런 식으로 작동하지 않는 이유입니다 –

관련 문제