Ошибка Rails AssociationTypeMismatch Не могу понять - PullRequest
0 голосов
/ 22 апреля 2011

Я довольно новичок в rails (и ruby), и я столкнулся с тем, что кажется простой проблемой, но я не смог понять, что я делаю неправильно. В приведенных ниже примерах кода я настроил модели Project, Attribute и User и их ассоциации. Кроме того, я включил код миграции на случай, если у меня возникнет проблема.

Кажется достаточно простым, но когда я делаю следующее в консоли rails:

proj = Project.create(:name => 'first project', :link => 'http://www.me.com', :ownerid => 1, :desc => 'First project description', :active => true)

Я получаю эту ошибку:

ActiveRecord::AssociationTypeMismatch: Attribute(#2162685940) expected, got Array(#2151973780)

Так что же я делаю не так? Я понял, что рельсы думают, что должны получить Атрибут, но вместо этого получают Массив, но я не понимаю почему. Я могу успешно создать атрибут или пользователя, и когда я удаляю has_many: attribute из модели проекта, я могу успешно создать проект.

class Project < ActiveRecord::Base
  has_many :users
  has_many :attributes
end

class Attribute < ActiveRecord::Base
  belongs_to :project
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :project
end

class CreateProjects < ActiveRecord::Migration
  def self.up
    create_table :projects do |t|
      t.string  :name
      t.string  :link
      t.integer :owner  #user_id#
      t.text    :desc
      t.boolean :active
      t.timestamps
    end
  end

  def self.down
    drop_table :projects
  end
end

class CreateAttributes < ActiveRecord::Migration
  def self.up
    create_table :attributes do |t|
      t.string  :name
      t.integer :project_id
      t.timestamps
    end
  end

  def self.down
    drop_table :attributes
  end
end

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string  :email
      t.string  :password
      t.boolean :active
      t.boolean :admin
      t.string  :location
      t.string  :phone
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

1 Ответ

2 голосов
/ 22 апреля 2011

Attribute - зарезервированное слово, поэтому вам следует переименовать вашу модель.На самом деле, то, что зарезервировано, это attributes= метод.Поэтому, когда вы создаете ассоциацию has_many :attributes, вы переписываете стандартный метод

Вот API: атрибуты = и атрибуты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...