rails migration이요.
def self.up
create_table :accounts,{:primary_key => :account_id} do |t|
t.column "password", :string, :limit => 32
t.column "employee_id", :string, :limit => 5
t.column "access_controll_level", :string, :limit => 2
t.column "date", :datetime
t.column "create_date", :datetime
t.column "create_by", :string, :limit => 30
t.column "update_date", :datetime
t.column "update_by", :string, :limit => 30
t.column "del_flag", :integer
end
def self.down
drop_table :accounts
end
end
궁금한 것이 있습니다.
primary_key => :account_id를 보면 integer형인데요, 이걸string형으로 변환할수 없는지요?
migration 하고
migration 하고 ActiveRecord::Base 와는 직접적인 관계는 없습니다.
그래서 ActiveRecord가 인지하는 primary key를 변경하려면 다음을 참고하세요.
http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002290
mysql adapter 에서 promary_key 의 형을 변경하는 방법은 없어 보입니다.
입력된 :primary_key 는
TableDefinition -> ColumnDefinition을 거쳐서 sql을 생성하게됩니다.
http://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L105
create_table을 따라가보면, 이 지점에서 sql 생성 요청을 하는데, type 변수에 :primary_key 가 담겨 있습니다.
http://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L398
이걸 각 db adapter에 적절한 형을 만드는데 이곳에 정의되어 있습니다.
http://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb#L180
변경 불가능하게 되어 있네요.
구지 하신다면, change_column 을 이용하셔야 겠네요.
SeeAlso http://groups.google.com/group/rubykr
ps. ctags 만세.
글쓴이..
소중한 답변 감사드립니다.
해결했습니다.
너무너무 감사합니다.
C:\ruby\lib\ruby\gems\1.8\gems\activerecord-2.1.0\lib\active_record\connection_adapters/mysql_adapter.rb
def native_database_types #:nodoc:
{
:primary_key => { :name => "varchar", :limit => 30}, <-- 여기를 수정해 버렸습니다.
:string => { :name => "varchar", :limit => 255 },
:text => { :name => "text" },
:integer => { :name => "int"},
:float => { :name => "float" },
:decimal => { :name => "decimal" },
:datetime => { :name => "datetime" },
:timestamp => { :name => "datetime" },
:time => { :name => "time" },
:date => { :name => "date" },
:binary => { :name => "blob" },
:boolean => { :name => "tinyint", :limit => 1 }
}
end
결과 적으로
mysql> desc accounts
-> ;
+-----------------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-------------+------+-----+---------+-------+
| account_id | varchar(30) | YES | | NULL | | <--- 변경되었습니다.
| password | varchar(32) | YES | | NULL | |
| employee_id | varchar(5) | YES | | NULL | |
| access_controll_level | varchar(2) | YES | | NULL | |
| last_login_date | datetime | YES | | NULL | |
| create_date | datetime | YES | | NULL | |
| create_by | varchar(30) | YES | | NULL | |
| update_date | datetime | YES | | NULL | |
| update_by | varchar(30) | YES | | NULL | |
| del_flag | int(11) | YES | | NULL | |
+-----------------------+-------------+------+-----+---------+-------+
10 rows in set (0.00 sec)
글쓴이
왜...
삭제 버튼을 눌렀을 경우
http://localhost:9000/account/delete/eieieie
Mysql::Error: Unknown column 'id' in 'where clause': DELETE FROM `accounts` WHERE `id` = NULL
에러가 발생하는지요? 울고 싶다.
분명히
create_table :accounts,{:primary_key => :account_id} do |t| 에서
id를 account_id를 변경했는데요..., 왜 삭제버튼을 누르면 id를 찾는지 모르겠습니다.
account_id를 왜 안찾는지요?
원 답글 중 이 부분이
원 답글 중 이 부분이 있습니다.
http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002290
그런데, primary key를 꼭 저렇게 string 형태로 해야되는 상황이신가요?
댓글 달기