2

私は持っている

class CreateRoles < ActiveRecord::Migration 
  def change
    create_table :roles do |t|
      t.string :name

      t.timestamps
    end
  end
end

class Role < ActiveRecord::Base
  attr_accessible :name
  has_many :members, :posts
end

class Post < ActiveRecord::Base
  attr_accessible :content, :title, :role_id
  belongs_to :role
end

class Member < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :lockable

  attr_accessible :role_id, :first_name, :last_name, :email, :password, :password_confirmation, :remember_me
end

Railsコンソールまたはseeds.rbで、次のように入力します

Role.create(name: 'guest')

そしてエラーを取得します

TypeError: can't convert Symbol into Integer
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/associations/builder/collection_association.rb:35:in `[]'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/associations/builder/collection_association.rb:35:in `wrap_block_extension'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/associations/builder/collection_association.rb:22:in `build'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/autosave_association.rb:139:in `build'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/associations/builder/has_many.rb:10:in `build'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/associations/builder/collection_association.rb:13:in `build'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/associations.rb:1195:in `has_many'
    from /Users/ataylo9/Dropbox/Developer/hamsterdam/app/models/role.rb:3:in `<class:Role>'
    from /Users/ataylo9/Dropbox/Developer/hamsterdam/app/models/role.rb:1:in `<top (required)>'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:469:in `load'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:469:in `block in load_file'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:639:in `new_constants_in'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:468:in `load_file'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:353:in `require_or_load'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:502:in `load_missing_constant'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:192:in `block in const_missing'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:190:in `each'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:190:in `const_missing'
    from (irb):1
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands/console.rb:47:in `start'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands/console.rb:8:in `start'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'

Rails はメンバーと投稿の関係を構築したいので、エラーが発生することはわかっていますが、単にそれらを nil にするべきではありません。私は、seeds.rb で明示的に配列を nil に設定しようとしましたが、同じエラーが発生しました。

私は何を理解できていないのですか?ありがとう!

更新: 参照用に Post および Member モデルを追加

4

3 に答える 3

3

同じモデルで同じプロジェクトを作成しました。そして、このような記述関係でエラーが発生することがわかりました。

class Role < ActiveRecord::Base
  attr_accessible :name
  has_many :members, :posts
end

私はこれを試しました:

class Role < ActiveRecord::Base
  attr_accessible :name
  has_many :members
  has_many :posts
end

class Post < ActiveRecord::Base
  attr_accessible :name, :role_id
  belongs_to :role
end

class Member < ActiveRecord::Base
  attr_accessible :name, :role_id
  belongs_to :role
end

そして、すべてが機能します。理由はわかりませんが、 has_many :posts, :members で問題が発生するようです。ただし、この問題を解決するために別の方法で書くことができます。

于 2013-01-11T08:57:42.440 に答える
2

jizak の答えは、私自身の問題の解決策を見つけるという点で、私を正しい方向に導くのに役立ちました。最初は、上記の例のように、単一の has_many に複数の「アイテム」を追加しようとしていました。

has_many :members, :posts

Rails コンソールで同じエラーが表示されます - 「TypeError: シンボルを整数に変換できません。」そこで、2 つの異なる行に分割しました。

has_many :members
has_many :posts

そして今、それはうまくいきます。

アソシエーション (has_many) は attr_accessor/writer/reader に似ていると考えて、少し賢くなりすぎたのだと思います。ここでは、単一の attr_x (またはこの場合は has_many) に複数のものを追加できます。これは Rails には当てはまりません (私の知る限り) - 各関連付けには独自の個別の宣言が必要です。

于 2013-03-28T15:15:06.223 に答える
0

存在しないリレーション (has_many :members, :posts) を割り当てたようです。そのようなモデルはありますか?モデルはそのような関係を持っていますか?Member と Post モデルのコードを投稿できますか?

于 2013-01-10T14:15:37.240 に答える