2009-11-20 2 views
1

나는 데이터베이스 과정에 있으며 강사는 전자 상거래 앱을 개발하기를 원합니다. 그녀는 우리가 좋아하는 어떤 프레임 워크라도 사용할 수 있다고 말했고, 이제는 학기 중반기에 Rails가 너무 많이하고 내 SQL 쿼리를 명시 적으로 작성하기를 원합니다.레일 맞춤형 모델 기능

그래서 내가하고 싶은 것은 내 자신의 함수를 작성하여 모델에 추가하여 본질적으로 이미 존재하는 기능을 복제하는 것입니다 (그러나 직접 작성한 SQL을 사용하여).

그래서 질문은 다음이 될 :

  1. 을 어떻게 모델 내에서 수동으로 만든 쿼리를 실행합니까?
  2. 결과를 비어있는 객체에 채워 넣고 뷰 내부에서 돌아와서 사용할 수 있습니까?

또한 끔찍한 연습이 무엇인지 알고 있습니다. 나는이 시점에서 PHP에서 처음부터 시작하고 싶지 않습니다.

+0

죄송하지만 거의 모든 단일 프레임 워크에는 요즘 ORM이 있습니다. 예를 들어 Doctrine을 살펴보십시오. ActiveRecord는 SQL 숨기기에도 도움이되지 않습니다 - 조건/그룹/조인 옵션의 일부로 SQL을 작성할 수 있습니다. –

+0

ActiveRecord는 ** SQL을 숨기기 위해 ** 시도하지 않습니다. 레일즈의 창시자 인 데이비드 하인 마이어 한슨 (David Heinemeier Hansson)이 [레일즈 애자일 웹 개발 (Agile Web Development with Rails)] 책 (315 쪽) (http://event2011.googlecode.com/files/Agile_Web.pdf) : "[Active Record]는 사소한 경우에 SQL이 더럽지도 나쁘지도 않다는 개념에 기반을두고 있으며, 사소한 경우에 자세한 정보를 처리 할 필요성을 없애는 데 중점을 둡니다. 수동으로 삽입하면 프로그래머가 지쳐 가지 만 하드 쿼리에 대한 표현력을 유지할 수 있습니다. 유형 SQL은 우아하게 처리하기 위해 만들어졌습니다. " –

답변

4

제가 생각하기에, 정말로 필요한 2-3 가지 방법을 알고 있어야합니다. 당신의 데이터베이스 사용에 대한 쿼리를 실행하기 위해, 예를 들어 (우리는 적어도 2 모델, 주문 및 사용자 주문 (고객)가 가정)이 :

Order.connection.execute("DELETE FROM orders WHERE id = '2') 

데이터베이스에서 개체 수를 얻으려면, 가장 좋은 방법은 "count_by_sql"메서드를 사용하는 것입니다. 저는 테이블에 500 개가 넘는 레코드가있는 프로젝트에서 사용하고 있습니다. 응용 프로그램을 계산하는 모든 작업이 데이터베이스에 제공되며 응용 프로그램보다 훨씬 효율적입니다.

Order.count_by_sql("SELECT COUNT(DISTINCT o.user_id) FROM orders o") 

이 쿼리는 주문한 모든 단일 사용자의 수를 가져옵니다. 테이블을 "조인"하고 "주문"을 사용하여 결과를 정렬하고 그룹 결과를 얻을 수 있습니다.

과 가장 자주 사용 방법 : find_by_sql

Order.find_by_sql("SELECT * FROM orders") 

그것이 당신에게 루비 객체와 배열을 반환합니다.

2

class Purchase < ActiveRecord:Base 
    def Purchase.find(id) 
     Purchase.find_by_sql(["Select * from purchases where id=?", id]) 
    end 
end 

어쩌면 당신이 특정 구매 제품을 원하는 구매가 있다고 할 수 있습니다. Purchase_item을 구매 모델에서 수동으로 정의 할 수 있습니다.
class Purchase < ActiveRecord:Base 
    def purchased_items 
     PurchasedItem.find_by_sql(["Select * from purchased_items where purchase_id=?",self.id]) 
    end 
end 

그래서 예를 들어, 당신이 지금 특정 구매를 위해 구입 한 항목을 얻으려면 컨트롤러에 당신이 지금 할 수있는이

@purchase = Purchase.find(params[:id]) 
@purchased_items = @purchase.purchased_items 

데이터베이스에 더 원시 연결을해야하는 경우, ActiveRecord를 살펴볼 수 있습니다 : Base.connection.execute (sql)