我们在哪里声明rails模型的属性?

我来自Java背景,我已经开始学习Ruby on Rails。 请考虑http://guides.rubyonrails.org/active_record_basics.html中提到的以下代码

class Product < ActiveRecord::Base end 

该指南提到这会创建一个映射到表产品的模型Product(使用ruby的复数机制)。 它还提到,“通过这样做,您还可以使用模型实例的属性映射该表中每行的列。”

但是我们没有在模型Product中声明任何属性。 它是如何知道它的属性是什么?

一个假设:表的每个属性都是作为模型的属性。 这是真的吗? 那么,我们首先创建SQL表吗? 如果我稍后更改表(比如添加新列),它是否也会动态更改我的模型?

重要的区别在于我们讨论的是ActiveRecord模型,即ActiveRecord::Base子类(直接和间接),即使用其持久性机制的子类。 一般来说,Rails模型不适用以下情况 。 但话说回来,对于非AR模型,这个问题毫无意义:)

表的每个属性都是作为模型的属性。 这是真的吗?

是。

那么,我们首先创建SQL表吗?

究竟。 rails g model创建一个模型文件和一个包含模型后面的表的声明的迁移 。 因此,在使用模型之前,必须先运行迁移。

如果我稍后更改表(比如添加新列),它是否也会动态更改我的模型?

现在这很棘手。 如果在更改之后重新加载应用程序(例如,在开发模式中这种情况偶尔会发生),这肯定是正确的,因为模型类将被重建。 所以答案是肯定的,大部分时间都是如此

但是,这只是关于模型类的内部结构 (在例如Model.columns可见),您并不总是需要关心它。 获取数据时, 结果集的所有列都将映射到模型对象的属性。 因此,这甚至可以保留您在SELECT指定的自定义列:

 Thing.select(:id, "1 AS one").first.attributes #> SELECT "things"."id", 1 AS one FROM "things" ORDER BY "things"."id" ASC LIMIT 1 # => {"id"=>1, "one"=>1} 

它的工作原理如下:

 class Product < ActiveRecord::Base 

Product被子类ActiveRecord::Base (你知道从Javainheritance,对吧?)。

ActiveRecord::Base可以在这里看到:

Active Record对象不直接指定它们的属性,而是从与它们链接的表定义中推断它们。 添加,删除和更改属性#及其类型直接在数据库中完成。 任何更改都会立即反映在#Active Record对象中。 将给定的Active Record类绑定到某个#database表的映射将在大多数常见情况下自动发生,但可以为不常见的情况覆盖。

你可以阅读其他代码; 简而言之,这意味着ActiveRecord使用SQL模式来填充相应的属性。

-

因为您的model是一个Class ,所以ActiveRecord基本上会使用db中的值创建一系列setter/getter实例方法 。

当您调用所述类时, ActiveRecord::Base将使用数据库中的值填充相应的实例方法,允许您调用@product.name等。

rails中的模型只是绑定数据库中数据的简便方法。 模型就是数据。

模型表示一个表,并将该表的所有列作为其属性。

该模型就是Product 。 通过rails约定,此模型直接映射到数据库中的products表,并具有表所具有的所有属性作为列。

模型和表是相互关联的,模型作为实际数据的简单抽象层,以提供易于工作和额外的validation等等。

您只需在迁移中声明特定属性(创建表)。 否则,ActiveRecord会做出一些关键假设:

 name of the table = lowercase version of class name = products primary key = id 

然后它可以在启动连接时使用原始SQL来从表中获取属性列表:

 DESCRIBE table products; 

这为它提供了表格中字段的完整列表。 它根据这些字段在类的每个实例中设置属性。