Как вы сеете модели с отношениями HABTM к другим моделям - PullRequest
5 голосов
/ 11 октября 2010

Я работаю над своим первым приложением Rails (3) и собираюсь собрать кучу данных.

Проблема, с которой я столкнулся, заключается в том, что я хочу посеять некоторые модели, имеющие отношение has_and_belongs_to_many, с другими моделями, которые я только что посеял. Я делаю то, что кажется правильным, но я не получаю ожидаемых результатов.

У меня есть модель Asana (упрощенно):

class Asana < ActiveRecord::Base
  has_and_belongs_to_many :therapeutic_foci
end

и модель TherapeutFocus:

class TherapeuticFocus < ActiveRecord::Base
  has_and_belongs_to_many :asanas
end

В моем db / seed.rb я создаю несколько терапевтических фокусов:

tf = TherapeuticFocus.create([
  {:name => 'Anxiety'},
  {:name => 'Asthma'},
  {:name => 'Fatigue'},
  {:name => 'Flat Feet'},
  {:name => 'Headache'},
  {:name => 'High Blood Pressure'},
  {:name => 'Stress'} ])

Затем создайте асану:

asanaCreate = Asana.create!([
  { :english_name => 'Mountain Pose', 
    :traditional_name => 'Tadasana', 
    :pronunciation => 'TadaSANA', 
    :deck_set => 'Basic', 
    :type => 'Standing', 
    :therapeutic_foci => TherapeuticFocus.where("name in ('Stress','Flat Feet')")}
])

В результате создаются модели TherapeutFocus, создается Asana, но она не создает связей с моделями TherapeuticFocus. Полученный массив пуст.

Если я бегу

TherapeuticFocus.where("name in ('Stress','Flat Feet')")

в консоли rails я получаю две ожидаемые записи:

irb(main):010:0> TherapeuticFocus.where("name in ('Stress','Flat Feet')")
=> [#<TherapeuticFocus id: 6, name: "Flat Feet", description: nil, created_at: "2010-10-11     01:48:02", updated_at: "2010-10-11 01:48:02">, 
    #<TherapeuticFocus id: 19, name: "Stress",     description: nil, created_at: "2010-10-11 01:48:02", updated_at: "2010-10-11 01:48:02">]

Итак, как это сделать?

Или есть лучший способ сделать это?

Спасибо!

ОТВЕТ НА ПОСТ:

Я уже добавил перегиб:

ActiveSupport::Inflector.inflections do |inflect|
    inflect.irregular 'focus', 'foci'
end

Моя миграция для таблиц соединения выглядит так:

create_table :asanas_therapeutic_foci, :id => false do |t|
  t.references :asana, :therapeutic_focus
end

Я попробую изменить это значение на t.belongs_to вместо t.references и посмотреть, сработает ли это.

1 Ответ

5 голосов
/ 11 октября 2010

Вы зарегистрировали множественное число для «фокуса»? Он не определен по умолчанию, поэтому вам нужно определить его (обычно в config/initializers/inflections.rb):

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'focus', 'foci'
end

Вам также необходимо убедиться, что в вашей миграции определена правильная таблица соединений для ассоциации HABTM. Вот соответствующая часть «восходящей» миграции, которую я использовал:

    create_table :asanas do |t|
      t.string :english_name
      t.string :traditional_name
      t.string :pronunciation
      t.string :deck_set
      t.string :type
    end
    create_table :therapeutic_foci do |t|
      t.string :name
    end
    create_table :asanas_therapeutic_foci, :id => false do |t|
      t.belongs_to :asana
      t.belongs_to :therapeutic_focus
    end

Я использовал модели, как вы указали.

С этими битами я смог загрузить ваши начальные определения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...