在Rails中创建新表,从另一个数据库加入字段

时间:2016-02-15 21:35:22

标签: ruby-on-rails regex csv

在我的教会网站上,很多成员都是已婚夫妇。我有一个来自成员资格数据库的csv文件,它使用一个七位数的标识符,如下所示:

  00903 1

该人的配偶将

  00903 2

我想做的是创建一对情侣及其纪念日的表格。如何获得包含

的行
  her_first_name:string his_first_name:string family_name:string. 

换句话说,如何识别两个记录如何链接的唯一方法是将最后一个"数字"在一个字符串?是否涉及Regex,如果是,查询是什么样的?感谢

1 个答案:

答案 0 :(得分:1)

我的方法是做这样的事情(我假设它总是相同的格式,对于一对夫妇,前5个数字实际上是相同的。我也是假设您需要检查每条记录是否有配偶,而不是您已经知道他们已婚。最后,我假设您有一个名为Couple的模型,其中包含相关的couples表,个人成员名为Person的模型,其中ind_id字段作为标识符,我为每个字段组成行位置。):

individuals = [] # an array that can hold each record until a spouse is found in the csv

csv.each do |row|
  id_regexp = Regexp.new(row[0][0..4] + '.') # creates a regexp out of the first 5 characters in the id, then adds '.' to match any following characters
  spouse = individuals.select { |individual| individual.ind_id =~ id_regexp }.first #searches individuals for that regexp, returns the first instance if it exists, or nil otherwise
  if spouse
    couple = Couple.new(wife_name: spouse.first_name, husband_name: row[1], last_name: row[2], anniversary: row[3], etc.) # if a spouse was found create a Couple record
    couple.save!
    individuals.delete(spouse) # remove this record from the array so there is one less record to iterate over on the next loop
  else
    individuals << Person.new(first_name: row[1], last_name: row[2], etc.) # build a Person and store it in the array. You could persist the Person to the db if you are saving individuals with this import as well
  end
end

现在,你可以在那里添加支票,给定配偶,检查哪个是丈夫,哪个是妻子,具体取决于12 { {1}}插槽:

ind_id[6]

这显然会介于 if spouse.ind_id[6] == '1' couple.wife_name = spouse.first_name couple.husband_name = row[1] else couple.husband_name = spouse.first_name couple.wife_name = row[1] end couple = Couple.new(...

之间

无论如何,由于OP中提供的详细信息量,我不得不承担很多责任,但希望这能为您提供一个模板。如果您没有couple.save!课程,则可以创建一个哈希并每次将其推送到Person并与individuals中的individual[:ind_id]进行比较。

注意

我使用了Regexp,因为你指定了它。可以轻松做到

select