2013-07-29 8 views
17

Mam Listings controller, a użytkownicy mogą dodawać opis. Jeśli opis jest długi, to powinien, otrzymuję ten błąd w Heroku:PG :: StringDataRightTruncation: BŁĄD: Łańcuch PostgreSQL (255) limit | Heroku

ActiveRecord::StatementInvalid (PG::StringDataRightTruncation: ERROR: 
value too long for type character varying(255) 

Jak mogę to naprawić?

Edit

dowiedziałem się (John powiedział to też), że muszę zmienić w moim stole łańcucha (który ma limit) na adres: tekst, który jest nieograniczona. Ale tylko zmiana tabeli w migracji nie działa.

My Edited ofert Migracja

class CreateListings < ActiveRecord::Migration 
def change 
create_table :listings do |t| 
    t.string :title 
    t.text :description, :limit => nil 

    t.timestamps 
end 
end 
end 

ale nadal jestem coraz Heroku problemy ->

2013-07-29T09:39:05.069692+00:00 app[web.1]: ActiveRecord::StatementInvalid (PG::StringDataRightTruncation: ERROR: value too long for type character v rying(255) 
2013-07-29T09:39:05.069870+00:00 app[web.1]: 
2013-07-29T09:39:05.069692+00:00 app[web.1]: : INSERT INTO "listings" ("created_at", "description", "image_content_type", "image_file_name", "image_fil _size", "image_updated_at", "price", "title", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id"): 
2013-07-29T09:39:05.069870+00:00 app[web.1]: app/controllers/listings_controller.rb:35:in `block in create' 
2013-07-29T09:39:05.069870+00:00 app[web.1]: app/controllers/listings_controller.rb:34:in `create' 
2013-07-29T09:39:05.069870+00:00 app[web.1]: 
2013-07-29T09:39:05.069860+00:00 heroku[router]: at=info method=POST path=/listings host=vaultx.herokuapp.com fwd="178.59.173.169" dyno=web.1 connect=3 s service=1882ms status=500 bytes=1266 

Odpowiedz

21

Wydaje się, że określenie kolumny jak: typ tekstu, a nie: string będzie napraw ten problem.

+0

Tak, tylko fundusz to, ale mam problemy z uruchomieniem tego. Jeśli po prostu zaktualizuję migrację, nie będzie działać na heroku. Będę edytować moje pytanie: –

+0

Twoja migracja powinna być następująca: 't.text: description,: limit => zero' not 't.string' –

+0

Cóż :(nadal otrzymuję problemy z herokiem –

2

Wejście podana jest zbyt długa dla pola string, więc po prostu zmienić na polu text:

class ChangeListingsDescriptionTypeToText < ActiveRecord::Migration 
    def change 
    change_column :listings, :description, :text 
    end 
end 

Następnie uruchom rake db:migrate

10

Nie zmieniać swoich poprzednich migracje. Nigdy nie rób tego z reguły. Zamiast tego musisz utworzyć nową migrację, które pozwoli na zmianę (i pozwalają cofnąć w razie potrzeby).

Najpierw wygenerować migracji:

rails g migration change_datatype_on_TABLE_from_string_to_text 

następnie zmodyfikować wygenerowany plik, tak aby wyglądał (zmiana nazwy kolumn tabeli i jeśli to konieczne):

class ChangeDatatypeOnTableFromStringToText < ActiveRecord::Migration 
    def up 
    change_column :table_name, :column_name, :text, :limit => nil 
    end 

    def down 
    change_column :table_name, :column_name, :string 
    end 
end 

teraz uruchom migrację:

bundle exec rake db:migrate 

To powinno wystarczyć. (Uwaga: osobno zdefiniowałem metody "up" i "down" zamiast metody zmiany, ponieważ użycie metody zmiany działa tylko z migracjami odwracalnymi, a próba wycofania zmiany typu danych spowodowałaby wyjątek ActiveRecord :: IrreversibleMigration.)

Powiązane problemy