繁体   English   中英

如何通过Rails中的seed.rb从yaml文件中为联接表数据设置种子

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

我试图在我的seed.rb中添加将数据加载到ROR 3.2.5应用程序的联接表上的功能。

我有两个模型: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文件中为两者的数据集播种,例如:keyword_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文件中为联接表添加初始数据集。 (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

我得到:




**调用db:structure:load_if_sql(first_time)
**调用db:create
**执行db:structure:load_if_sql
**调用db:seed(first_time)
**执行db:seed
**调用db:abort_if_pending_migrations(首次)
**调用环境
**执行db:abort_if_pending_migrations
耙子流产了!
未初始化的常量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



我该如何工作?

编辑:

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

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

这意味着这些关系将从一侧或另一侧建立。 假设我认为一个Saft更可能具有多个Keywords我将对此进行如下处理。

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

  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我建议仅从可读性的角度来看,但这应该可以给您带来更清晰的画面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM