Как заполнить данные таблицы соединений из файла yaml через seed.rb в Rails

0

Я пытаюсь добавить к моему 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.

  • 0
    Глупый вопрос, а вы создали таблицу SaftKeyword ?
  • 0
    Моя таблица соединений соответствует миграции на Rails и называется safts_keywords, но я также пробовал Saft_Keyword в seed.rb, но безрезультатно. Спасибо за предложение!
Показать ещё 5 комментариев
Теги:
ruby-on-rails-3

1 ответ

0
Лучший ответ

Таблицы объединений 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 я бы рекомендовал это с точки зрения удобочитаемости, но это должно дать вам более четкое изображение.

  • 0
    Благодарю. Saft - это журнал, каждое издание которого определяется набором ключевых слов. Ключевые слова могут быть связаны с несколькими выпусками журнала с другой стороны. По этой причине у меня есть HABTM с обеих сторон. Несмотря на то, что в настоящее время он используется для дополнительной модели, я постараюсь как можно скорее найти решение.
  • 0
    Я проверил это, и оно работает на удивление, хотя, поскольку мне приходится использовать Ruby 1.8.7, мне нужно заменить «word: key» на «: word => key». Но в моем случае таблица ключевых слов имеет строки «id», «keyword» и «description», как я могу протолкнуть дополнительные строки через ассоциацию в таблицу ключевых слов с этим решением?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню