【问题标题】:Rails loading fixtures with wrong foreign keysRails 加载带有错误外键的夹具
【发布时间】:2014-06-23 13:56:24
【问题描述】:

我正在使用 rails 4.1.0 编写一个简单的应用程序。我创建了两个模型,分别称为 Serie 和 Event,它们之间具有一对多的关系(就像一个 Serie 有许多事件一样)。

class Serie < ActiveRecord::Base
  has_many :events
end

class Event < ActiveRecord::Base
  belongs_to :serie
end

我为这些模型创建了以下夹具文件:

#series.yml
---
Serie1:
  name: Whatever

#events.yml      
---
EventSerie11:
  date: 2013-01-01
  value: '124.4'
  serie: Serie1
EventSerie12:
  date: 2013-02-01
  value: '124.2'
  serie: Serie1

问题是当我使用rake db:fixtures:load 加载这些固定装置时,我得到了错误的事件对象的外键:

$ rails c
Loading development environment (Rails 4.1.0)
2.1.1 :001 > Serie.first.id
  Serie Load (0.2ms)  SELECT  "series".* FROM "series"   ORDER BY "series"."id" ASC LIMIT 1
 => 10
2.1.1 :002 > Serie.first.events.count
  Serie Load (0.3ms)  SELECT  "series".* FROM "series"   ORDER BY "series"."id" ASC LIMIT 1
   (0.2ms)  SELECT COUNT(*) FROM "events"  WHERE "events"."serie_id" = ?  [["serie_id", 10]]
 => 0  
2.1.1 :003 > Event.first.serie
  Evento Load (0.2ms)  SELECT  "events".* FROM "events"   ORDER BY "events"."id" ASC LIMIT 1
  Serie Load (0.3ms)  SELECT  "series".* FROM "series"  WHERE "series"."id" = ? LIMIT 1  [["id", 627975337]]
 => nil 
2.1.1 :004 > Evento.first.serie_id
  Evento Load (0.4ms)  SELECT  "eventos".* FROM "eventos"   ORDER BY "eventos"."id" ASC LIMIT 1
 => 627975337 

所以你看到所有的固定装置都在加载,但是事件记录被分配了一个不正确的 serie_id 外键(因为我使用 sqlite 进行开发,所以没有约束检查)。据我所知,每次重置数据库并加载灯具时,Serie 记录都会获得一个新的 id,但每个 Event 记录的 serie_id 字段始终设置为 627975337。

我读到here,您可以为您的固定装置指定加载顺序;但是添加行

ENV["FIXTURES"] ||= "series,events" 

到我的 environment.rb 文件没有工作,也没有运行

rake db:fixtures:load FIXTURES=series,events

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby sqlite ruby-on-rails-4 fixtures


    【解决方案1】:

    我认为 Rails 与 series 的类/装置名称混淆了。它试图寻找一个名为Series 的模型类,因为它很难将你的复数名称单数化。 (系列是英语单词,复数与单数相同)。

    我强烈怀疑您数据库中的 Serie 实例与您的夹具负载完全无关,而是通过另一种方法创建的实例。

    您的活动装置中使用的serie_id 是正确的。使用的 id 使用以下公式计算:

    > ActiveRecord::FixtureSet.identify(:Serie1)
    => 627975337
    

    您可以看到与您的固定装置中使用的值相同。

    因此,一个解决方案,您可以进入活动记录的内部并覆盖加载固定装置的 rake 任务 - 或者您可以将“serie”/“series”的单数/复数版本定义为您想要的而不是 rails 的猜测。在config/application.rb 或初始化器中,您可以添加:

    ActiveSupport::Inflector.inflections do |inflect|
      inflect.irregular 'serie', 'series'
    end
    

    【讨论】:

    • 先生,您是一位绅士和一位学者。在这里,有更多的声誉。
    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多