【问题标题】:Rails - has_many relation causes NoMethodErrorRails - has_many 关系导致 NoMethodError
【发布时间】:2013-11-02 10:33:06
【问题描述】:

我有以下迁移和模型:

class CreatePlatforms < ActiveRecord::Migration
  def change
    create_table :platforms do |t|

        t.integer :user_id
        t.string :name
        t.string :platform_id
        t.timestamps
    end
  end
end

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|

        t.string :email
        t.string :first_name
        t.string :last_name
        t.string :gender
        t.date :birthday
        t.timestamps
    end
  end
end

class Platform < ActiveRecord::Base
    belongs_to :user
end

class User < ActiveRecord::Base
    attr_accessible :email, :first_name, :last_name, :gender, :birthday
    has_many :platforms
end

有了这个定义,我可以创建用户和平台:

user = User.new
platform1 = Platform.new
platform2 = Platform.new

甚至我可以将用户与平台相关联:

platform1.user = user

但是当我尝试将平台与用户关联或从用户那里获取平台时,它会崩溃:

user.platforms << user or user.platforms
NoMethodError: undefined method `platforms' for #<User:0x007f8cfd47a770>

【问题讨论】:

  • 你确定你已经重新加载了环境和用户变量本身?例如,如果您在 Rails 控制台中有一个用户实例,运行迁移,更新用户模型然后重新加载控制台,它仍然无法工作,因为用户实例是由旧版本的类组成的,您需要创建一个新的(再次从数据库中获取)。如果它发生在您的开发服务器环境中,请提供更多上下文/详细信息。
  • 重装控制台也是一个非常有可能的解决方案!
  • 我在第一次迁移数据库后完成了。但以防万一我重新加载了控制台,问题仍然存在。没有更多的上下文,这是一个 Rails 空项目(rails 4.0.0 ruby​​ 2.0.0)
  • 对了,为什么会有一个字符串字段platform_id? Rails 自动生成ids...
  • 你是对的TheChamp,但在这种情况下platform_id不是自己模型的id,而是社交网络(facebook_id,twitter_id等)提供的id 平台是社交网络和用户可能有多个社交网络与之关联。

标签: ruby-on-rails ruby model associations has-many


【解决方案1】:

事实证明,问题在于数据库字段platform_id。这弄乱了轨道。只需将其删除即可。

【讨论】:

  • 这很奇怪,因为我重新加载了控制台并且问题仍然存在。你是怎么做到的?复制/粘贴我的代码?
  • 你能成功保存用户和平台吗?
  • 而简单的reload! 不行,您必须退出然后重新打开它
  • 我已经关闭并重新打开了控制台,这不是问题。我已尝试保存所有实例,但没有更好的结果。我注意到的是,当我按下制表时,控制台不会为我自动完成用户的“平台”字段(即: user.plat ),所以我认为用户模型中的平台属性有问题,可以吗?
  • 只是为了确保您没有弄乱变量:User.first.platforms 失败?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多