如何通过 Rails 中的 seed.rb 从 yaml 文件中加入 table 数据

How to seed join table data from yaml file through seed.rb in Rails

我正在尝试为我的 seed.rb 添加将数据加载到我的 ROR 3.2.5 应用程序的连接 table 的能力。

我有两个模型:Saft.rb和Keyword.rb,我想加入。

class Saft < ActiveRecord::Base
   has_and_belongs_to_many :keyword, :join_table => "safts_keywords"
end

class Keyword < ActiveRecord::Base
  attr_accessible :word
  has_and_belongs_to_many :saft, :join_table => "safts_keywords"
end

我从 yaml 文件中为两者播种数据集,例如来自:keywords_list.yml

---
  - word: "12"

  - word: "34"

我的对应部分Seed.rb:

keywords_data = YAML.load_file(Rails.root.join('db/seeds/keywords_list.yml'))
keywords_data.each do |keyword|
    h = Keyword.find_or_initialize_by_word(keyword['word'])
    h.save
end

现在我也想从 yaml 文件中为连接 table 播种初始数据集。 (safts_keywords.yml)

---
  - saft_id: 1
    keyword_id: 2

当我尝试通过以下方式加载数据时:

# Load the Join Table
safts_keywords_data = YAML.load_file(Rails.root.join('db/seeds/safts_keywords_list.yml'))
safts_keywords_data.each do |saftkeyword|
    h = SaftKeyword.find_or_initialize_by_saft_id(saftkeyword['saft_id'], 
    :keyword_id => saftkeyword['keyword_id'])
    h.save
end

我得到:

.
.
.
** Invoke db:structure:load_if_sql (first_time)
** Invoke db:create
** Execute db:structure:load_if_sql
** Invoke db:seed (first_time)
** Execute db:seed
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment
** Execute db:abort_if_pending_migrations
rake aborted!
uninitialized constant SaftKeyword
/Users/Stephan/Development/REPRO/saftzine_com/db/seeds.rb:99
/Users/Stephan/Development/REPRO/saftzine_com/db/seeds.rb:97:in `each'
/Users/Stephan/Development/REPRO/saftzine_com/db/seeds.rb:97
.
.
.

我怎样才能让它工作?

已编辑:

我通过迁移创建了连接 table。它被命名为 "safts_keywords",但 Saft_Keyword 在 seed.rb 中也不起作用。

HABTM 连接表通常没有与之关联的模型,因为它们只是连接表,没有别的。

这意味着这些关系将从一侧或另一侧建立。鉴于我的假设 Saft 更有可能有多个 Keywords 我会按如下方式进行。

我不知道 Saft 是什么,但如果您知道他们的 ID,我会推荐以下内容:

  1: 
    - keyword1
    - keyword2
    - keyword3
  2:
    - keyword2
    - keyword4

那么你的种子文件为:

  safts_keywords_data = YAML.load(Rails.root.join('db/seeds/safts_keywords_list.yml'))
  safts_keywords_data.each do |saft_id,keywords|
    saft = Saft.find(saft_id)
    saft.keywords << keywords.map do |key| 
      Keyword.find_or_create_by(word: key)
    end 
  end 

如果有更清晰的方法来定位唯一性 Saft 我会建议仅从可读性的角度来看,但这应该会给你一个更清晰的画面。