如何将具有HABTM关系的模型与其他种子模型联系起来

时间:2010-10-11 02:07:11

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

我正在开发我的第一个Rails(3)应用程序,并希望播放一堆数据。

我遇到的问题是,我想为一些与我刚刚播种的其他模型建立了has_and_belongs_to_many关系的模型。我做的似乎是正确的,但我没有得到我期待的结果。

我有一个Asana模型(简化):

class Asana < ActiveRecord::Base
  has_and_belongs_to_many :therapeutic_foci
end

和TherapeuticFocus模型:

class TherapeuticFocus < ActiveRecord::Base
  has_and_belongs_to_many :asanas
end

在我的db / seeds.rb中,我创建了一些TherapeuticFoci:

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

然后创建一个Asana:

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')")}
])

结果是创建了TherapeuticFocus模型,创建了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">]

那么,一个人怎么做呢?

或者,有更好的方法吗?

谢谢!

POST ANSWER:

我已经添加了变形:

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 个答案:

答案 0 :(得分:5)

您是否注册了“焦点”的复数?它没有默认定义,因此您需要定义它(通常在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

我按你引用的方式使用了这些模型。

有了这些位,我就可以加载你的种子定义了。