2012-10-21 51 views
0

我有一個attribue attemptsinteger類型的數據庫(初始值爲0)活動記錄的屬性和在紅寶石類型轉換/導軌

當我@user.attempts += 1,它引發TypeError: can't convert Fixnum into String

所以,我的結論是rails不會根據數據類型自動轉換屬性。

當我做

@user.attempts.to_i +=1 

它拋出NoMethodError: undefined method 'to_i=' for "0":String

當我做,

@user.attempts.to_i = @user.attempts.to_i + 1 

再次拋出NoMethodError: undefined method 'to_i=' for "0":String

而這一點,

@user.attempts = @user.attempts.to_i + 1 

工作正常。

我認爲原因是當我做@user.attempts.to_i + 1時,它實際上改變了左邊的@user.attempts

有人可以指出這種行爲嗎?

編輯

遷移

class CreateUsers < ActiveRecord::Migration 
     def change 
     create_table :users do |t| 
      t.string :email 
      t.string :email_pass 
      t.integer :attempts 
      t.timestamps 
     end 
     end 
    end 

創建表腳本

-- Table: users 

-- DROP TABLE users; 

CREATE TABLE users 
(
    id serial NOT NULL, 
    email character varying(255), 
    email_pass character varying(255), 
    attempts character varying(255), 
    created_at timestamp without time zone NOT NULL, 
    updated_at timestamp without time zone NOT NULL, 
    CONSTRAINT users_pkey PRIMARY KEY (id) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE users 
    OWNER TO jashwant; 

我看到,在DB attempts是字符類型。

那麼,應該改變它的數據類型的正確方法。 而且我也非常看好第一個問題,這種類型轉換的原因是什麼?

+0

顯示您的遷移腳本,以及數據庫中的「SHOW CREATE TABLE」。 –

+0

@SergioTulentsev,我已經更新了我的問題。 – Jashwant

回答

1

當您使用+=這樣的:

something += 1 

它是一樣的:

something = something + 1 

當你這樣做,

obj.method = val 

它是一樣的:

obj.method=(val) 

所以你實際上調用#to_i=@user.attempts哪些不存在。

當你做@user.attempts = @user.attempts.to_i + 1,您的電話是一樣的,因爲這一個:

@user.attempts=(@user.attempts.to_i + 1) 

其存在,且正常工作。

+0

對send的更好的解釋是:'obj.method = val'和'obj.send('method =',val)'是一樣的,所以'@user.attempts.to_i + = 1'和' @ user.attempts.send('to_i =',@ user.attempts.to_i + 1)'。 – Laas

2

使用change_column在遷移:

rails g migration change_attempts_to_integer_for_users 

...

打開並編輯遷移

def self.up 
    change_column(:users, :attempts, :integer) 
end 

def self.down 
    change_column(:users, :attempts, :text) 
end 

運行遷移。