【问题标题】:Relational Database in Rails: how many references do I need?Rails 中的关系数据库:我需要多少引用?
【发布时间】:2015-10-23 23:18:45
【问题描述】:

在我的 rails 应用程序中,Person has_many :measurements 和 Measurement belongs_to a :person。 我将关联添加到模型文件中。然后我为这个关联写了两个迁移。

class AddMeasurementRefToPeople < ActiveRecord::Migration
  def change
    add_reference :people, :measurement, index: true, foreign_key: true
  end
end

class AddPersonRefToMeasurements < ActiveRecord::Migration
  def change
    add_reference :measurements, :person, index: true, foreign_key: true
  end
end

我的schema.rb 看起来像这样:

ActiveRecord::Schema.define(version: 20150730121109) do

  create_table "measurements", force: :cascade do |t|
    t.datetime "date"
    t.integer  "weight"
    t.integer  "bmi_calc"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer  "person_id"
  end

  add_index "measurements", ["person_id"], name: "index_measurements_on_person_id"

  create_table "people", force: :cascade do |t|
    t.string   "name"
    t.float    "length"
    t.datetime "created_at",     null: false
    t.datetime "updated_at",     null: false
    t.integer  "measurement_id"
  end
add_index "people", ["measurement_id"], name: "index_people_on_measurement_id"

end

现在我怀疑我是否真的需要 both 迁移。现在,我在两个模型中都有一个 foreign_key。一个还不够吗? (如果是这样,我应该回滚 2 个迁移中的哪一个?)

【问题讨论】:

  • 一个就够了。您无需在people 中添加measurement_id
  • @Pavan 您能否更改您在答案中的评论?
  • 我恢复了我的迁移maud$ rake db:migrate:down VERSION=20150730091740 == 20150730091740 AddMeasurementRefToPeople: reverting ======================== -- remove_reference(:people, :measurement, {:index=&gt;true, :foreign_key=&gt;true}) 在我的迁移列表中没有提到这个取消迁移,所以恢复没有出现。但是,我的 DB schema.rb 已更新并反映了恢复的迁移。我应该在迁移文件夹中看到一个新的迁移文件吗?
  • @Mauddev 向下运行迁移旨在逆转架构更改。它不会删除或恢复任何文件更改。 AddMeasurementRefToPeople 迁移应该被永久删除并且不再运行。因此,在向下迁移之后(正如您在上一条评论中所做的那样——这恢复了对架构的更改),您应该删除迁移文件。它应该命名为db/migrate/20150730091740_add_measurement_ref_to_people.rb。如果此文件未被删除,它将在您下次执行 rake db:migrate 时再次运行(它会向上运行所有挂起的迁移)。
  • @WizardofOgz 谢谢!这就说得通了。与此同时,我找到了另一个解决方案:我添加了 RemoveMeasurementRefFromPeople 迁移。但是您的解决方案要简洁得多,我会记住的。

标签: ruby-on-rails ruby-on-rails-4 database-schema foreign-key-relationship


【解决方案1】:

根据你的联想,一个人有很多度量,度量只属于一个人。

您只需要测量表中的人员外键。无需将measurement_id 添加到人,因为一个人有很多测量值..

所以AddPersonRefToMeasurements 就足够了

在模型中你应该这样做

class Person < ActiveRecord::Base
  has_many :measurements
end


class Measurement < ActiveRecord::Base
  belongs_to :person
end

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    相关资源
    最近更新 更多