如何通过Rails

时间:2018-02-06 17:47:35

标签: mysql ruby-on-rails ruby ruby-on-rails-3

我正在尝试添加到我的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中不起作用。

1 个答案:

答案 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,我建议仅从可读性的角度来看,但这应该会给你一个更清晰的画面。