ActiveRecord는 Rails에서 제공하는 Object-relational mapping (ORM) 계층이다.
Table은 클래스들(Classes:Models)이 되고,
Row는 하나의 오브젝트(Object;Model)가 되며,
각 Column들은 객체 속성을 나타낸다.
Rails에서의 ActiveRecord는 개발자가 코딩하는 양을 최소한으로 줄여주도록 만들어져 있다.
각 Model은 Model이름 + s 테이블에 대해서 자동적으로 매핑하도록 되어 있기때문에
자바처럼 개발자가 일일히 각 속성을 쓸필요가 없다.
예를 들자면 아래와 같다
Products라는 테이블에 대해서 자바와 Rails로 각각 모델을 구현해보자
(Procucts는 name:String, value:String, number:Integer라는 속성을 가지고 있다.)
Java
Rails
public class Product {
private String name;
private String value;
private int number;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the value
*/
public String getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(String value) {
this.value = value;
}
/**
* @return the number
*/
public int getNumber() {
return number;
}
/**
* @param number the number to set
*/
public void setNumber(int number) {
this.number = number;
}
}
class Product < ActiveRecord::Base
end
Java에서는 해당 Table의 컬럼에 대한 속성을 일일히 선언하지 않으면 안되지만
Rails에서는 Object명을 선언해주고 하면 개발자가 할게 없다.
나머지 속성매핑은 ActiveRecord쪽에서 다 해주기 때문이다.
Java는 클래스이름을 어떤걸 하고 속성이름을 어떤걸 하더라도
대입해주면 로직을 쓰면 상관없다.(단 비지니스 계층에는 그만큼의 로직을 써야하겠지만..)
Rails는 속성을 정의 하지 않아도 자동적으로 대입되는 편리함이 있는 만큼 내부적인 규칙이 있다.
1. 테이블 이름
모델이름은 어떤것이라도 상관없지만
그 모델에 대한 테이블 이름은 '모델 + s'가 된다.
즉 Rails에서 ActiveRecord를 상속하고 있는 Model에 대한 테이블을 찾을때에는
모델의 이름 + s 의 테이블을 찾게 된다.
예를 들어 Product라는 Model을 생성했을경우 해당테이블은 자동적으로 Products가 된다.
이것이 Rails에서 모델과 table의 기본적인 매칭 규칙이다.
2. Primary Key
Rails에서 모델을 생성하면 Table을 작성하는 구문이 만들어지는데 어떤 모델이라도 id라는 column을 자동적으로 생성해 Primary Key로 만들게 되어 있다.
그리고 기본적으로 Rails에서 DML작업을 할때 기준이 되는것은 id 다.
Rails에서 생성된 DB migrate
Migrate한 후에 생성된 table
class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.string :title
t.text :description
t.string :image_url