如何通过 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
我会建议仅从可读性的角度来看,但这应该会给你一个更清晰的画面。
我正在尝试为我的 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
我会建议仅从可读性的角度来看,但这应该会给你一个更清晰的画面。