Я пытаюсь добавить к моему 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: create
** Выполнить 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: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
я бы рекомендовал это с точки зрения удобочитаемости, но это должно дать вам более четкое изображение.
SaftKeyword
?