【问题标题】:Confused by Rails 4 association bug对 Rails 4 关联错误感到困惑
【发布时间】:2014-07-31 18:08:34
【问题描述】:

我正在充实一个新的 Rails 应用程序,并且是第一次使用 Rails 4。脚手架已就位,为每个 MVC 定义了一个“名称”字段。

然后我创建了一个简单的迁移和第一个模型关联:

class Ability < ActiveRecord::Base
    belongs_to :player, class_name: "Player", foreign_key: "player_id"
end

class Player < ActiveRecord::Base
    has_many :abilities
end

控制台显示正确的字段。我可以保存东西:

> Ability.first
Ability Load (0.1ms)  SELECT  "abilities".* FROM "abilities"   ORDER BY "abilities"."id" ASC LIMIT 1
=> #<Ability id: 1, name: "Ability0", value: 50, created_at: "2014-07-31 16:41:59", updated_at: "2014-07-31 18:14:57", player_id: nil> 

> Player.first
Player Load (0.3ms)  SELECT  "players".* FROM "players"   ORDER BY "players"."id" ASC LIMIT 1
=> #<Player id: 1, name: "Player0", created_at: "2014-07-31 16:42:00", updated_at: "2014-07-31 16:42:00"> 

> Ability.first.player = Player.first
Ability Load (0.4ms)  SELECT  "abilities".* FROM "abilities"   ORDER BY "abilities"."id" ASC LIMIT 1
Player Load (0.2ms)  SELECT  "players".* FROM "players"   ORDER BY "players"."id" ASC LIMIT 1
=> #<Player id: 1, name: "Player0", created_at: "2014-07-31 16:42:00", updated_at: "2014-07-31 16:42:00"> 

> Ability.first.save!
Ability Load (0.4ms)  SELECT  "abilities".* FROM "abilities"   ORDER BY "abilities"."id" ASC LIMIT 1
(0.1ms)  begin transaction
(0.1ms)  commit transaction
=> true

但是存档不想“取”:

> Ability.first
Ability Load (0.4ms)  SELECT  "abilities".* FROM "abilities"   ORDER BY "abilities"."id" ASC LIMIT 1
=> #<Ability id: 1, name: "Ability0", value: 50, created_at: "2014-07-31 16:41:59", updated_at: "2014-07-31 18:14:57", player_id: nil>

我知道这很简单,但我很困惑。有什么问题?

【问题讨论】:

  • 当您尝试执行此操作时能否使用完整的控制台输出进行更新?
  • 已按照@DylanMarkow 的建议更新...

标签: ruby-on-rails-4 associations


【解决方案1】:

您将player 关联到Ability 的实例并保存一个完全不同的Ability 实例(没有关联的player),这就是未映射播放器的原因与你的技能实例。

让我们来看看这些步骤:

步骤 1

Ability.first.player = Player.first

在这里,您创建了Ability 的匿名实例,它引用abilities 表中的第一条记录,然后将其关联到players 表中的第一条记录。这都是内存中的,关联还没有保存在表中。

第二步

Ability.first.save!

接下来,您将再次创建Ability一个新的匿名实例,它指的是abilities 表中的第一条记录。但它与步骤 1 中创建的实例无关。因此,当您触发保存时!在它上面,它不会保存任何内容,因为在这种情况下没有更改任何字段。


你可以做的是:

ability = Ability.first
ability.player = Player.first
ability.save!

在所有步骤中,您都使用同一个实例进行更改。

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2017-07-31
    • 2014-07-08
    • 2017-02-28
    • 2013-07-04
    相关资源
    最近更新 更多