2012-12-12 36 views
6

Có cách nào để thay đổi tên cột mà kẹp giấy sử dụng khi tạo di chuyển cơ sở dữ liệu không? Ví dụ, hiện nay một di dân kẹp giấy trông như thế này:Thay đổi tên cột bằng đá quý kẹp giấy

class AddAvatarColumnsToUsers < ActiveRecord::Migration 
    def self.up 
    add_attachment :users, :avatar 
    end 

    def self.down 
    remove_attachment :users, :avatar 
    end 
end 

Và nó tạo ra sau trong cơ sở dữ liệu:

avatar_file_name 
avatar_file_size 
avatar_content_type 
avatar_updated_at 

Lý tưởng nhất là tôi muốn thay đổi avatar_file_name tương ứng với một cột trong cơ sở dữ liệu được gọi là "nội dung". Điều này có thể không?

Trả lời

4

Đổi tên cột, thành một thứ khác ngoài <attachment>_<attribute> sẽ không hoạt động trong Paperclip.

Nó cách bắt buộc cần 4 thuộc tính sau cho mỗi tập tin đính kèm trong mô hình:

  • <attachment>_file_name
  • <attachment>_file_size
  • <attachment>_content_type
  • <attachment>_updated_at

Kiểm tra này gửi ra cho một cuộc tranh luận về lý do tại sao sau mộtCách tiếp cậncó thể tốt hơn là có một mô hình riêng cho tệp đính kèm (<attachment>.url): Paperclip and Inheritance (STI)

0
ruby script/generate migration RenameDatabaseColumn 

class RenameDatabaseColumn < ActiveRecord::Migration 
    def self.up 
    rename_column :user, :avatar_file_name, :user_file_name 
    rename_column :user, :avatar_file_size, :user_file_size 
    rename_column :user, :avatar_content_type, :user_content_type 
    rename_column :user, :avatar_updated_at, :user_updated_at  
    end 

    def self.down 
    # rename back if you need or do something else or do nothing 
    end 
end 

Chỉ cần thử di chuyển có thể là nó sẽ làm việc cho bạn. thêm tên cột bất kỳ tên cột tương ứng nào.

+0

Tôi đồng ý rằng chắc chắn sẽ thay đổi tên cột, nhưng giấy sẽ vẫn biết ghi vào cột đó trong cơ sở dữ liệu sau khi đổi tên không? – bswinnerton

+0

Trong mô hình của bạn cũng thay đổi như dưới đây ** attr_accessible: user has_attached_file: user,: styles => {: medium => "300x300>",: thumb => "100x100>"} và xem <% = f.file_field : user%> và ** cũng thay đổi ** user ** thay vì ** avatar **. Nó sẽ hoạt động. –

+0

Nhưng một lần nữa. Làm thế nào tôi có thể thay đổi nó từ một cái gì đó như: user_file_name thành: nội dung, và vẫn còn có kẹp giấy biết rằng những gì tôi có nghĩa là _file_name? – bswinnerton

0

Khi bạn chạy rails g migration add_avatar_columns_to_users, bạn có thể viết như bạn đã viết. Nhưng nếu bạn muốn thay đổi tên cột, hãy chuyển đến tệp di chuyển và thay đổi chúng như bạn muốn như sau. Xin vui lòng không di chuyển nó cho đến khi và trừ khi bạn thay đổi các cột.

class AddAvatarColumnsToUsers < ActiveRecord::Migration 
    def self.up 
    add_column :users, :your_file_name,:string 
    add_column :users, :your_content_type, :string 
    add_column :users, :your_file_size,:integer 
    add_column :users, :yourfile_updated_at,:datetime 
    end 

    def self.down 
    remove_column :users, :your_file_name 
    remove_column :users, :your_content_type 
    remove_column :users, :your_file_size 
    remove_column :users, :yourfile_updated_at 
    end 
end 


Bây giờ chạy rake db:migrate

trên sẽ làm việc cho chắc chắn. Và thêm tập tin đính kèm của bạn accordinbly.

+0

Nhưng giấy in sẽ vẫn biết ghi vào cột đó trong cơ sở dữ liệu nếu nó không kết thúc bằng _file_name? – bswinnerton

1

Đối với người dùng tận dụng S3 hoặc Google Cloud Storage, bạn có thể cần di chuyển tệp của mình sang thư mục mới theo sơ đồ đặt tên tệp của kẹp giấy. Đây là di chuyển mẫu để hướng bạn đi đúng hướng:

class MovePaperclipAssets < ActiveRecord::Migration                
    def up                           

    storage = Fog::Storage::Google.new google_storage_access_key_id: ENV["GOOGLE_ACCESS_KEY_ID"],      
             google_storage_secret_access_key: ENV["GOOGLE_SECRET_ACCESS_KEY"]    
    bucket = storage.directories.get('bucket-name') 

    bucket.files.each do |file|                      
     if file.key.starts_with?("original/directory")               
     newfile = file.key.gsub("original/directory","new/directory")    
     file.copy('bucket-name', newfile)                
     file.destroy                        
     end                           
    end 
    end                            

    def down  
    storage = Fog::Storage::Google.new google_storage_access_key_id: ENV["GOOGLE_ACCESS_KEY_ID"],      
             google_storage_secret_access_key: ENV["GOOGLE_SECRET_ACCESS_KEY"]    
    bucket = storage.directories.get('bucket-name') 

    bucket.files.each do |file|                      
     if file.key.starts_with?("new/directory")               
     newfile = file.key.gsub("new/directory","original/directory")    
     file.copy('bucket-name', newfile)                
     file.destroy                        
     end                           
    end 
    end  
end 
Các vấn đề liên quan