<div class="warning"> 이 글은 "웹 개발 2.0 루비 온 레일스" 를 공부하면서 개인적으로 정리한 내용입니다. 상세한 내용을 보고자 하시는 분은 책을 구매하시길 바랍니다. </div>

명명규칙#

테이블명모델 클래스명모델 클래스파일
usersUserapp/models/user.rb
birth_recordsBirthRecordapp/models/birth_record.rb

모델 클래스에서 명시적인 테이블 선언#

class Group < ActiveRecord::Base
  set_table_name "group_table"
end

검색하기#

pk값으로 조회하는 형태이다.

@user=User.find(1)

다음은 복합적인 조회조건으로 첫번째 인자인 :first는 첫번째 데이터를 반환하라는 옵션이고 모든 데이터를 반환하기 위해서는 :all 을 사용하면 된다. 그리고 :conditions뒤에 붙는것이 실제 조회조건으로 name=? 에서 ?에 뒤에 넘어온 문자열이 들어간다. 그외 :order, :offset, :limit, :readonly 등의 옵션이 있다.

name="fromm0"
@user=User.find(:first, :condition=>["name=?", name])

@user=User.find(:all, :conditions=>["id>?"0],
:order=>"name desc",
:offset=>"1",
:limit=>"1",
:readonly=>true)

  • find_by_칼럼명() 메소드
find_by_칼럼명() 형태를 취한다. 즉 해당 칼럼값으로 조회를 하는것이다.

@user=User.find_by_name("이동국")

@user=User.find_by_sql("select * from users where name='DongGukLee'")

수정하기#

  • save 메소드 호출

삭제하기#

  • destroy 메소드 호출 -> 한건의 데이터 삭제시 이용
  • destroy_all 메소드 호출 -> 여러건의 데이터 삭제시 이용
  • delete 메소드 호출 -> 데이터베이스에서 직접 삭제, 인자로 pk값을 넣어줘야 한다.
  • delete_all 메소드 호출 -> 데이터베이스에서 직접 삭제, 인자로 조건문을 넣어줘야 한다.

데이터 검증하기#

데이터 검증 관련 메소드는 다음 URL에서 볼수 있다. http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
  • validates_acceptance_of -> 일종의 체크박스 선택 유무에 따른 검증
  • validates_confirmation_of
  • validates_exclusion_of
  • validates_format_of
  • validates_inclusion_of
  • validates_length_of
  • validates_numericality_of
  • validates_presence_of
  • validates_size_of
  • validates_uniqueness_of

class User < ActiveRecord::Base
  validates_presence_of :id, :name, :message => "필수값 입력하세요."
  validates_length_of :login, :maximum => 20, :message => "로그인 아이디가 너무 깁니다."
end

  • 콘솔창에서 실행시 검증 에러 보기
full_messages 메소드를 사용한다.

@user.errors.full_messages

모델간의 관계 설정#

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
  • 1:N 관계
User : Posts = 1 : N 관계이다. 여기서 관계설정을 위해 has_manybelongs_to 를 사용했다.
class User < ActiveRecord::Base
  has_many :posts
  
  validates_presence_of :id, :name, :message => "please input value!!!"
  validates_length_of :password, :mininum => 1, :maximum => 20, :message => "password is too long."
end

class Post < ActiveRecord::Base
  belongs_to :user
end

>> @user1=User.find(1)
=> #<User:0x48995f0 @attributes={"name"=>"DongGukLee""id"=>"1""note"=>"this
is test""password"=>"c12345""login"=>"fromm0""registered_on"=>"2007-07-2
3"}>
>> @user2=User.find(2)
=> #<User:0x4896210 @attributes={"name"=>"JinJuLee""id"=>"2""note"=>nil, "pa
ssword"=>"fromm0""login"=>"pearl3929""registered_on"=>"2007-07-23"}>
>> @user1.posts
=> []
>> @user2.posts
=> []
>> @post = Post.new
=> #<Post:0x4888cb4 @attributes={"title"=>nil, "content"=>nil, "user_id"=>nil},
@new_record=true>
>> @post.title="post test"
=> "post test"
>> @post.content="hahahahaha"
=> "hahahahaha"
>> @post.user=@user1
=> #<User:0x48995f0 @attributes={"name"=>"DongGukLee""id"=>"1""note"=>"this
is test""password"=>"c12345""login"=>"\nfromm0""registered_on"=>"2007-07-2
3"}@posts=[]>
>> @post.save
=> true
>> @user1.posts
=> []
>> @user1=User.find(1)
=> #<User:0x486f7dc @attributes={"name"=>"DongGukLee""id"=>"1""note"=>"this
is test""password"=>"c12345""login"=>"fromm0""registered_on"=>"2007-07-23"
}>
>> @user1.posts
=> [#<Post:0x486d0cc @attributes={"title"=>"post test""id"=>"1""content"=>"h
ahahahaha""user_id"=>"1"}>]
>> @user1.posts << Post.new(:title=>"test", :content=>"haha")
=> [#<Post:0x486d0cc @attributes={"title"=>"post test""id"=>"1""content"=>"h
ahahahaha""user_id"=>"1"}>, #<Post:0x4864f08 @errors=#<ActiveRecord::Errors:0x
4863ef0 @errors={}@base=#<Post:0x4864f08 ...>>, @attributes={"title"=>"test",
"id"=>2"content"=>"haha""user_id"=>1}@new_record=false>]
>> @user.posts
=> [#<Post:0x485f544 @attributes={"title"=>"post test""id"=>"1""content"=>"h
ahahahaha""user_id"=>"1"}>, #<Post:0x485f530 @attributes={"title"=>"test""id
"=>"2""content"=>"haha""user_id"=>"1"}>]

여기서 post객체 추가후 @user1.posts를 했을때 추가된 post값이 보이지 않는다. 이것은 현재 다른 트랜잭션에서 작업이 되었기 때문이다. 다시 조회후 볼수 있거나 다시 조회하지 않는다면 @user1.posts(true) 와 같이 인자로 true값을 넣어주면 다시 조회할 필요없이 추가된 post정보가 보이게 된다. 그리고 배열형태의 객체에 데이터를 추가하고자 할때는 << 를 사용하는 방법도 있다.

  • 의존성이 걸리는 데이터의 처리 여부
관계를 가지는 데이터의 경우 pk값을 가지는 주 데이터를 삭제할 경우 관계된 fk의 부 데이터의 처리 여부가 문제가 될수 있다. 다음처럼 :dependent 속성을 사용하면 된다. 사용할수 있는 값은 :destroy(종속된 데이터 모두 삭제), :nullify(참조키 값을 모두 NULL로 변경), :nil(데이터를 그대로 둔다. 디폴트)

class User < ActiveRecord::Base
  has_many :posts, :dependent=>:destroy
end

  • 1:1관계

class User < ActiveRecord::Base
  has_one :birth_record
end

  • M:N 관계
User(M) : Membership(조인 모델) : Club(N)

class User < ActiveRecord::Base
  has_one :birth_record
  has_many :memberships, :dependent=>:destroy
  has_many :clubs, :through=>:memberships
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :club
end

콜백 메소드#

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

class User < ActiveRecord::Base
  def before_create
    logger.info "User.before_create"
  end
end

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-8) was last changed on 23-Jul-2007 22:57 by DongGukLee