我正在尝试添加到我的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文件中为两者设置种子数据集,例如: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文件中为连接表播种初始数据集。 (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:创建
**执行db:structure:load_if_sql
**调用db:seed(first_time)
**执行db:种子
**调用db:abort_if_pending_migrations(first_time)
**调用环境
**执行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:在每个&#39;
/Users/Stephan/Development/REPRO/saftzine_com/db/seeds.rb:97
点。
。
。
我怎样才能让它发挥作用?
编辑:
我通过迁移创建了连接表。它名为&#34; safts_keywords&#34;,但Saft_Keyword在seed.rb中不起作用。
答案 0 :(得分:0)
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
,我建议仅从可读性的角度来看,但这应该会给你一个更清晰的画面。