Ruby on rails RubyonRails中的交叉引用表

Ruby on rails RubyonRails中的交叉引用表,ruby-on-rails,ruby,database,activerecord,Ruby On Rails,Ruby,Database,Activerecord,我有一个ads表,它与ad_地址有1:n的关系,并且ad_复制表。 然后是类别和子类别表,其中类别与子类别表的关系为1:n,子类别表与ads表的关系为1:n 因此,子类别表有一个名为id_categories的引用字段,ads表有一个名为id_subcategories的引用字段 ads_地址和ads_复制表都有一个ad_id字段 现在我一直在忙着将json文件(以前的数据库)中的数据输入到新的rails应用程序中。我发现之前数据库的模式包含一个单独的表,其中包含所有引用字段,即id_类别、id

我有一个ads表,它与ad_地址有1:n的关系,并且ad_复制表。 然后是类别和子类别表,其中类别与子类别表的关系为1:n,子类别表与ads表的关系为1:n

因此,子类别表有一个名为id_categories的引用字段,ads表有一个名为id_subcategories的引用字段

ads_地址和ads_复制表都有一个ad_id字段

现在我一直在忙着将json文件(以前的数据库)中的数据输入到新的rails应用程序中。我发现之前数据库的模式包含一个单独的表,其中包含所有引用字段,即id_类别、id_子类别和ad_id字段

create_table "rel_anuncio", primary_key: ["id_anuncio", "id_categoria", "id_subcategoria"], force: :cascade, options: "ENGINE=MyISAM DEFAULT CHARSET=utf8" do |t|
  t.integer "id_anuncio", null: false
  t.integer "id_categoria", null: false
  t.integer "id_subcategoria", null: false
  t.integer "orden", null: false
end
下面是我如何为我的广告记录播种(json文件的表名是西班牙语):

对于行
“subcategory\u id:@subcat.id”
,我为nil:NilClass获得了一个a
“NoMethodError:undefined方法'id',因为没有子类别\u id链接到我实现的广告记录,因为子类别\u id位于不同的表中

现在我知道必须有一种方法在散列中交叉引用这些id,以便您可以看到哪些id号属于哪个记录。例如,如果您有id_子类别:3,那么它必须属于id为4的名为“Wok Restaurant”的广告记录

我想在rails应用程序中为我的广告记录添加正确的类别和子类别

更一般地说,我想知道有人将如何处理导入数据库的json文件,该文件的模式与RailsAP中您自己的数据库不同

下面是json文件的示例(每个表的第一行):


看起来,
Ad
&
子类别
具有多对多关系。因此,
rel\u anuncio
是建立关系的中间表

因为json的行的顺序与创建记录的方式不同

相反,尝试先创建
广告
,然后在末尾创建
类别
子类别

json_ads = parsed_json.find { |table| table['name'] == 'anuncios' }
ads = {}

json_ads['data'].each do |ad|
  ads[ad['id']] = Ad.create(
    [... ad fields]
  )
end
对于
类别
,也一样:

json_categories = parsed_json.find { |table| table['name'] == 'categorias' }
categories = {}

json_categories['data'].each do |category|
  categories[category['id']] = Category.create(
    [... category fields]
  )
end
现在您已经创建了
子类别
,您有了
散列
类别
来引用它们:

json_subcategories = json.find { |table| table['name'] == 'rel_anuncio' }
subcategories = {}

json_subcategories['data'].each do |subcategory|
  subcategories[subcategory['id']] = Subcategory.create(
    category: categories[subcategory['id_categoria'],
    [... ad fields]
  )
end
rel\u anuncio
信息将取决于您如何实现关系


希望有帮助。

您能提供原始JSON的示例吗?我可以从你的代码中猜出它是什么样子,但不能确定。我已经用json样本编辑了我的问题。谢谢Daniel,种子成功了,id_类别已经在subcategories表中播种。所以,如果我现在想做一个rel_ads表,它将处理resp之间的n:n。类别vs.广告和子类别vs.广告。我如何让seed.rb填充rel|u广告表?类似@OKMantis:json|u relationships=json.find{124; table | table['name']=='rel|u anuncio'}json|u关系['data']。每个都做|关系| RelAd.create(类别:类别[relationship['id|u categories],广告[relationship]['id_anuncio']],子类别:子类别[relationship['id_subcategoria']],结束如果解决了您的问题,请在顶部将答案标记为正确。当我这样做时,我没有发现任何错误,但当我查看控制台时,我看到了这些关系(我这样命名表)完全为空。为什么不从rel_anuncio获取任何内容?它向我显示:[1]pry(main)>Relationship.all Relationship Load(0.6ms)选择“relationships”。*from“relationships”=>[]ActiveRecord(当我使用.create!而不是.create时)提供了以下信息:ActiveRecord::RecordInvalid:验证失败:子类别必须存在
json_categories = parsed_json.find { |table| table['name'] == 'categorias' }
categories = {}

json_categories['data'].each do |category|
  categories[category['id']] = Category.create(
    [... category fields]
  )
end
json_subcategories = json.find { |table| table['name'] == 'rel_anuncio' }
subcategories = {}

json_subcategories['data'].each do |subcategory|
  subcategories[subcategory['id']] = Subcategory.create(
    category: categories[subcategory['id_categoria'],
    [... ad fields]
  )
end