什么是Ruby结构来建模一对多表?

时间:2013-02-16 14:49:42

标签: ruby-on-rails ruby ruby-on-rails-3.2

我有一个Organization表,其中包含以下字段:

id
name
time_zone

然后我还有一些其他表格,例如Doctors,其字段如下:

id
organization_id  #foreign_key to Organization
name
salary

我如何用Ruby建模?它是否与数组?哈希?地图?

我对Ruby不是很熟悉,所以不确定我们在Ruby中有什么用? 例如,如果它是平的,我可以使用一个简单的数组,但这个结构怎么样? 我希望以后能够访问和遍历层次结构。

1 个答案:

答案 0 :(得分:1)

class Organization < ActiveRecord::Base
  has_many :doctors
end

class Doctor < ActiveRecord::Base
  belongs_to :organization
end

确保你有organization_id喜欢你写的,然后你可以做(​​仅作为一个例子):

@doctor = Doctor.first
@doctor.organization

@organization = Organization.first
@organization.doctors

更新

不能用以下内容填充数据库:

Doctor.where(name: "Frank", specialization: "Rubber Duck Surgery").first_or_create

没有试过这个,但它可能比循环复杂数组更容易:

@organization = Organization.where(name: "Surgeons").first_or_initialize
["Bob", "Frank", "Harry"].each do |name|
  @organization.doctors.where(name: name).first_or_initialize
end
@organization.save

更新

好的,以下内容如何:

@doctor_names = ["Bob", "Rob", "Fred", "Bill"]
@doctor_salaries = [10000, 15000, 30000, 400]

def return_array_of_hashes(*data)
  array = []
  data[1].each_with_index do |d, i|
    hash = {}
    (0...data.count).to_a.in_groups_of(2).each do |a,b|
      hash.merge!({data[a] => data[b][i]})
    end
    array << hash
  end
  array
end

@doctors_array = return_array_of_hashes("name", @doctor_names, "salary", @doctor_salaries)
# => [{"name"=>"Bob", "salary"=>10000}, {"name"=>"Rob", "salary"=>15000}, {"name"=>"Fred", "salary"=>30000}, {"name"=>"Bill", "salary"=>400}]

@doctors_array.each do |hash|
  Doctor.where(hash).find_or_create
end

这样,您可以对正在创建的任何模型使用相同的方法,并且可以轻松地向阵列添加更多数据。只需确保按照key然后value的正确顺序添加数据。

您可能需要添加一个所有数组大小相同的检查,尽管您的模型验证可能会丢弃任何无效数据。