0

attemptsタイプのデータベースに属性がありますinteger(初期値は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;

attemptsdbでは文字タイプであることがわかります。

したがって、そのデータ型を変更する適切な方法は何である必要があります。そして、私は私の最初の質問でも際立っています、その型変換の理由は何ですか?

4

2 に答える 2

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

移行を実行します。

于 2012-10-21T15:01:11.457 に答える
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)

これは存在するため、正常に機能します。

于 2012-10-21T14:32:59.250 に答える