【问题标题】:Models need to be changed when migration files are changed?更改迁移文件时需要更改模型吗?
【发布时间】:2018-04-26 03:50:07
【问题描述】:

我是 Rails 的新手,目前对于我们的课程,我们必须创建一个包含数据库的应用程序。

我有一堆表具有其他表的外键,我已经在迁移文件中定义了这些关联(使用 execute("ALTER TABLE...")),但在我的模型中没有定义(我在我的模型中只定义了 self.primary_key模型)。

我的问题是,既然我已经在我的迁移中设置了这些关联,我是否还必须在我的模型中设置这些关联(即has_may, belongs_to, validates_uniqueness_of 等)?

我将创建一个允许用户输入的应用,并将这些输入插入到数据库中。

希望能解开我的困惑。谢谢!

示例

迁移文件:

class CreateSchools < ActiveRecord::Migration[5.0]
  def up
    create_table :schools, {:id => false} do |t|
      t.integer :school_id
      t.string :school_name
      t.string :contact_number
      t.integer :a_id

      t.timestamps
    end
    execute "ALTER TABLE schools ADD PRIMARY KEY(school_id);"
    execute "ALTER TABLE schools ADD CONSTRAINT a_id UNIQUE(a_id);"
    execute "ALTER TABLE schools ADD CONSTRAINT school_references_location FOREIGN KEY (a_id) REFERENCES locations(a_id) ON DELETE CASCADE ON UPDATE CASCADE;"
    change_column_null :schools, :school_name, false
    change_column_null :schools, :a_id, false
  end

  def down
    execute "ALTER TABLE schools DROP PRIMARY KEY;"
    execute "ALTER TABLE schools DROP FOREIGN KEY school_references_location;"
    execute "ALTER TABLE schools DROP INDEX a_id;"
    drop_table :schools
  end
end

型号:

class School < ApplicationRecord
  self.primary_key = :school_id
end

【问题讨论】:

  • 是的,你需要在模式下定义关联
  • @Vishal 当我在模型中定义我的关联时,它会对迁移文件产生影响吗?

标签: ruby-on-rails model rails-migrations


【解决方案1】:

是的,您还需要在模型中定义关联。

对于所有 Rails 应用程序,

  • 根据关联迁移和更改数据库是第一步。

  • 然后在模型中添加关联语句,以便可以使用简单的方法访问来自 db 的关联。比如user.posts等。

  • 在模型中添加关联语句为您提供了根据调用的方法生成查询的方法,以便轻松地从数据库中检索数据。如果您不想在模型中包含关联语句,也可以使用 join 和 select 语句查询 db。

因此,简而言之,设计模式来管理关联是必要的,而在模型中没有提及它们。但我们这样做是为了让我们的生活和代码更简单。

【讨论】:

  • 所以我所有的唯一、主键、外键和非空约束也必须在模型中?
  • 理想情况下是的。因为这将防止应用程序级别的数据出现任何不一致。因此,这是您的代码提供的一种检查。而您在迁移中提到的约束是数据库级别的,这些验证由数据库服务器处理。
  • 只是一个奇怪的问题。如果模型中没有定义它们会发生什么?
  • 例如,对于某个表的某些列,您在 db 中没有 null 约束,并且您没有在 Model 中提到该约束。然后您尝试保存一个 nil 值,然后您的代码将生成一个查询并尝试对数据库执行查询并保存。但是你的数据库会抛出一个指定原因的错误。如果您在模型中提到了这些验证,那么应用程序将在实际对 db 执行查询之前检查是否有任何约束失败。如果任何约束失败,那么即使尝试执行查询,它也会抛出错误。
  • 没错!你现在已经掌握了精髓:P
猜你喜欢
  • 2014-07-01
  • 1970-01-01
  • 2013-11-16
  • 2016-10-28
  • 2021-07-04
  • 1970-01-01
  • 2016-07-18
  • 2020-04-29
  • 2017-10-01
相关资源
最近更新 更多