어떻게 after_initialize 후크를 사용하는 방법에 대한;
는 스키마에 그 일에 관해서는, 나는, 내가 거기에 전문가는 아니지만 그건 당신이 사용중인 데이터베이스 엔진에 따라 달라집니다 거라 생각?
나는 당신이 기본 키로 UUID를 원하지 않는다는 가정하에 일하고있다. 나는 당신의 목적을 위해 그것을 피할 것입니다.
불행히도 테스트하지 않고이 모든 작업을 수행하고 있기 때문에 오타가 없었 음을 100 % 확신 할 수 없습니다. 문제가 발생하면 언제든지 메시지를 보내주십시오.
먼저 uuidtools를 프로젝트에 추가해야합니다. "설치 sudo는 레이크 보석"하고 보석을 다운로드하고 설치해야 위, 실행이 추가 한 레일이 가정이 설정/environment.rb에
Rails::Initializer.run do |config|
..
# You can try a later uuidtools version, but this is the one I've worked with
config.gem "uuidtools", :version => '2.1.1'
..
end
입니다.
validates_length_of :uuid, :is => 36 # Untested.. makes sense to me though
def after_initialize
self.uuid ||= UUIDTools::UUID.random_create.to_s
end
을 그리고 테이블을 만들기위한 마이그레이션의 :
그런 다음 모델에서,이 코드를 추가
create table :photo_albums do |t|
..
t.string :id, :limit => 36
..
end
나는이 도움이되기를 바랍니다.
Oskar
나는 그것을 사용하지 않을 것이다. 그렇지만 나는 보안에 대해 편집증 적이다. 소스 코드가 야생에 공개되면 해커는 적은 양의 테스트로 모든 객체에 대해 UID를 추측 할 수 있습니다. 항목이 작성 될 때쯤에 그들은 모든 usec 조합을 간단히 시도 할 수 있습니다. – oskarpearson
또는 ...다른 사람이 예제를 직접 복사하여 붙여 넣는 경우 공격자는 유출 된 소스 코드가 없어도 사용자가 누릴 수 있습니다. 그들은 제목이 있다고 가정하고 Time.current.usec는 최대 999999의 숫자 만 반환하기 때문에 "비밀"을 갖기 전에 999999 가지 가능성을 확인해야합니다. – oskarpearson
재미있는 점은 이것이 실제로 합리적인 규모의 서비스 - 수십만 개의 앨범이 만들어집니다. 결국 Time.current.usec은 같은 번호를 반환 할 것입니다. 앨범의 제목이 같고 usec 값이 같으면 uid 값이 두 앨범에서 동일 할 것입니다. 오리지널 포스터가 일반적인 기본 앨범 이름을 만들거나 사람들이 "내 파티"와 같은 것을 앨범 이름으로 사용한 경우에는 그리 멀지 않습니다. "생일의 역설"을 찾아보고 http://jeff.aaron.ca/cgi-bin/birthday – oskarpearson