Railscasts (no1 ~ no5) : 레일즈 스크린캐스트

2007. 3. 28. 18:11
아래내용은 railscasts.com 사이트에 올라온 동영상의 내용입니다. 레일즈 관련 팁들을 screencast 형태로 제공하고 있습니다. 직접 동영상을 보시면 더욱 좋습니다.

No1. Caching with instance variable

컨트롤러에서 모델의 find 메소드를 사용하는 경우 매번 DB 에 쿼리를 날리게 됩니다.

class ApplicationController < ActionController::Base

def current_user

User.find(session[:user_id]) # 이렇게 하면 매번 쿼리를 날리게 됨.

@current_user ||= User.find(session[:user_id])

end

end


볼드체로된 부분 처럼 항상 DB 쿼리를 하지 않도록, 인스턴스 변수를 활용해서 캐싱하는 형태로 사용하면 항상 DB자원을 사용하는 것을 줄여줄 수 있습니다.


No2. Dynamic find by methods

find 메소드의 형태를 좀더 간소하게 사용할 수 있는 find_by_methods 의 사용에 대해서 알아보도록 합니다. 간단하므로 아래 예제를 보도록 하죠.

find 메소드의 컨디션에 해당하는 컬럼을 메소드 명으로 줄 수 있습니다. 레일즈가 다이내믹하게 처리한다는 얘기죠.

class TasksController < ApplicationController

def incomplete

@tasks = Task.find(:all, :conditions => ['complete =?', false])

@tasks = Task.find_all_by_complete(false)

end

def last_incomplete

@task = Task.find(:first, :conditions => ['complete = ?', false], :order => 'created_at DESC')

@task = Task.find_by_complete(false, :order => 'created_at DESC')

end

end


No3. Find through association

모델간의 관계를 이용해서 데이타를 찾아도록 하는 방법에 대해서 알아보도록 합시다.

모델의 관계는 다음과 같습니다.

class Project < ActiveRecord::Base

has_many :tasks

end

class Task < ActiveRecord::Base

belongs_to :project

end

이경우 Association 을 이용해서 데이타를 가져오면서  No2 에서 제공하는 find_by_methods 까지 활용해서 수정을 하면 아래와 같습니다.

class ProjectsController < ApplicationController

def show

@project = Project.find(params[:id])

@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])

@tasks = @project.tasks.find_all_by_complete(false)

end

end

깔끔한 코드 ~~


No4. Move find into model

custom find 메소드를 생성해서 find 메소드를 모델로 이동시킬 경우 얻을 수 있는 장점은?

class TaskController < ApplicationController

def index

@tasks = Task.find_all_by_complete(false, :order => 'created_at DESC')

@tasks = Task.find_incomplete

end

end

위와 같은 형태에서 find_all_by_complete 를 find_incomplete 라는 클래스 메소드로 활용하게 되면 Task 모델에 다음과 같은 클래스 메소드를 추가하면 됩니다.

def self.find_incomplete

find_all_by_complete(false, :order => 'created_at DESC')

end

이런식으로 모델의 클래스 메소드로 생성해 두는 경우 아래와 같이 컨트롤러에서도 활용 가능죠.

class ProjectController < ApplicationController

def show

@project = Project.find(params[:id])

@tasks = @project.tasks.find_all_by_complete(false, :order => 'created_at DESC')

@tasks = @project.taskts.find_incomplete

end

end


No5. Using with scope

find 메소드를 커스텀하게 작성해서 모델로 이동시켜서 사용하는 경우, 커스텀 find 메소드로는 파라미터를 어떻게 전달할 수 있을 까요?

class Task < ActiveRecord::Base

belongs_to :project

def self.find_incomplete

find_all_by_complete(false, :order => 'created_at DESC')

end

end

이렇게 커스텀 find 메소드인 find_incomplete 를 생성해서 쓰고 있었는데, 이 메소드를 사용하는 컨트롤러에서는 호출시에 현재로서는 파라미터를 전달할 방법이 없습니다.

예를 들어서 아래와 같이 호출하고 싶은 경우 find_incomplete 메소드를 어떻게 수정하면 될까요?

class TaskController < AppliationController

def index

@tasks = Task.find_incomplete :limit => 20  #이렇게 파라미터를 추가해서 호출하고 싶다.

end

end

방법은 Rails 에서 제공하는 함수인 with_scope 를 사용하면 좀더 우아하게 처리할 수 있습니다.

find_incomplete 클래스 메소드를 수정해보도록 합시다.

def self.find_incomplete(options = {})

with_scope :find => options do

find_all_by_complete(false, :order => 'created_at DESC')

end

end

이렇게 수정하면 어떠한 형태의 파라미터도 다이내믹하게 처리할 수 있겠네요.

우아해졌습니다 ~~

P.S. 보다보니 벌써 동영상이 #11 까지 올라왔네요.. 나머지도 한번 가서 보세요... 짧으니 한꺼번에 보시면 저같은 초보 분들은 도움이 될만한 것들을 금방 얻을 수 있겠습니다.

[추가내용]
scope access method 관련해서 레일즈 플러그인이 하나 나왔네요.
AutoScope

Examples

Declare your scopes within your ActiveRecord::Base subclasses.

 class Contact < ActiveRecord::Base
auto_scope \
:old => {:find => {:conditions => ["born_on < ?", 30.years.ago]}},
:young => {:find => {:conditions => ["born_on > ?", 1.year.ago]}}
end

class Testimonial < ActiveRecord::Base
auto_scope \
:approved => {
:find => {:conditions => ["approved_at < ?", proc {Time.now}]},
:create => {:approved_at => proc {Time.now}}},
:unapproved => {
:find => {:conditions => "approved_at IS NULL"},
:create => {:approved_at => nil}}
end
이렇게 해주면 아래와 같이 사용하실 수 있습니다.
Testimonial.approved.count
Testimonial.unapproved.create!(params[:testimonial])
@young_contacts = Contact.young
@contacts = Contact.old.find(:all, :conditions => ["name LIKE ?", params[:name]])





,

쏟아지는 루비 서적들

2007. 3. 16. 10:39
사용자 삽입 이미지
넘쳐나는 루비와 레일즈 책들...
올해 들어서 루비 & 레일즈 관련 책들이 쏟아져 나오고 있습니다. 모두 아는 분들이 직접 쓰시거나 번역한 책들이라서 나올때 마다 족족 사서 보고 있는데 많은 도움이 되고 있어서 만족스럽게 생각하고 있습니다.
가지고 있는 루비 서적들을 모두 쌓아서 사진을 찍어볼라다가... 모두 쌓았더니 얼굴이 안나오더군요 ㅡㅡ;;; 예전에 자바와 루비 관련 접근에 대해서 책을 쌓아두고 비교하던 이미지가 생각납니다. 그때는  루비 쪽에는 달랑 2권 뿐이었는데, 지금은 비교할 수 없을 정도로 늘어났습니다. 이미지에 보이는 책들 말고도 가지고 있는 책이 3-4권은 더 되는 것 같습니다.

요즘에는 루비 관련 서적은 어쨌거나 앞으로 일해나가는데 있어서 어찌보면 단지 도구? 에 불과한 것이라는 생각도 드는 중이라서 (매일 퇴근할때 마다 루비 말고도 거의 밤새워서 공부해야 할만한 것들을 매일 매일 자극 받는 중이라 ㅠㅠ), 어서 루비 관련된 내용들을 섭렵하고 싶은 욕심이 나기도 합니다.

요즘은 어쨌든 그동안 평소에 일하면서 크게 고민해 보지 않았던 부분들에 대해서 약간씩 자극을 받으면서 지내구 있구요. 책들도 많이 보구 있구요... "스프링노트" 와 "미투데이" 를 (공교롭게도 아직 둘다 베타서비스중이네요. 서비스 오픈하게되면 관심가지고 사용해보시길 ~~ ) 가지고 놀면서 지내고 있습니다. 모두 멋진 서비스 들인데요, 언젠가 이런 멋진 서비스들을 직접 내 손으로 만들기 위해서 노력중입니다.

한동안 너무 소식이 뜸한듯 지내구 있어서 근황을 알려드릴 겸 ^^;;;

이상입니다.


'독서노트' 카테고리의 다른 글

무탄트메시지  (1) 2009.03.26
배고픔의 자서전  (3) 2007.01.02
시간을 파는 남자  (0) 2006.12.07
창조적 습관  (2) 2006.12.07
[독서노트] 학문의 즐거움  (0) 2006.10.31
,

Web-based IDE and debugger for Rails

2007. 2. 14. 11:34
Gyre 라는 오픈소스 툴이 나왔습니다. 웹기반의 레일즈 IDE 겸 디버깅 툴이라는 타이틀을 달고 있는데요, 개발자의 말에 의하면 아직은 pre-pre-pre alpha 상태이니 감안해서 봐달라고 합니다. 역시나 아직은 많이 불안정한 모습입니다.

이것또한 레일즈 어플리케이션으로 되어있습니다. 스크린캐스트도 올려져 있습니다.
사용자 삽입 이미지

screenshot


설치 방법은 아래와 같습니다.
sudo gem install -y ruby-debug -v 0.6.2
sudo gem install -y coderay
svn checkout http://gyre.bitscribe.net/svn/gyre/trunk gyre
cd gyre
mysqladmin create gyre
rake db:migrate
script/server -p 4000
기본적으로 Rails 1.2.1 로 되어있으니, Rails 1.2.2 를 쓰시는 분들은 config/environment.rb 에서 RAILS_GEM_VERSION 을 변경해 주시면 됩니다.

윈도우즈에 설치하시는 분들은 설치후 재시작시

TypeError in Project#index
Showing app/view/project/index.rhtml where line #32 raised:
can't convert nil into String ....

이런식의 오류가 날 수 있는데요, project_helper.rb 의 render_directory_dialog 에 보면 ENV["HOME"] 정보가 제대로 존재하지 않아서 그렇습니다. 대략 패쓰를 여러분들이 사용하시는 레일즈 어플리케이션이 있는 상위 디렉토리쯤으로 변경하시면 될 것 같습니다.

Gyre 를 설치한뒤 실행시키고 브라우저로 접속하면 처음 화면에서 프로젝트들을 등록하는 화면이 보이게 됩니다. 여기서 기존에 존재하는 레일즈 어플리케이션을 등록하게 되면 Gyre 는 기존의 레일즈 어플리케이션의 application.rb 파일에 내용을 추가하게 됩니다.

### The following was added by Gyre as a horrible, horrible hack.
### Remove if you wish to run the app standalone.
class ApplicationController < ActionController::Base
 before_filter :gyre_set_bp_retry
 def gyre_set_bp_retry
  params["BP-RETRY"] = true
 end
end
### EOH (end of horror)

확인해보니 위와 같은 내용이 추가되고 있었습니다. 이러한 것이 추가되는 이유는 익셥션을 핸들링 하기 위해서라는 군요. (브레이크 포인트를 걸기위한 용도로도 사용하는 것 같습니다). 디버거 상에서 어플리케이션이 실행되지 않는 경우에는 행걸릴수도 있으니 주의하라는 당부의 말도 있는 것 보면, 테스트용으로만 잠깐 써보는 것이 전부인 것 같습니다. 아직 많이많이많이 불안불안 합니다.

스크립트 기반의 레일즈 어플리케이션을 이렇게 꼭 브라우저로 IDE를 제공하고 디버깅 할 필요가 있을까 생각이 들기도 했지만, 어쨌든 디버깅에 많은 불편함을 느끼고 있는 저로서는 이러한 디버깅을 할 수 있는 옵션들이 많이 나타나는 것 자체가 반가운 소식입니다. 아직 갈길이 멀게만 느껴지는 중입니다.


 

,