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

时间:2016-01-10 03:18:03

标签: ruby-on-rails

我来自Java背景,我开始学习Ruby on Rails。请考虑http://guides.rubyonrails.org/active_record_basics.html

中提到的以下代码
class Product < ActiveRecord::Base
end

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

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

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

4 个答案:

答案 0 :(得分:4)

它的工作原理如下:

class Product < ActiveRecord::Base

Product 被子类化为 ActiveRecord::Base (你知道从Java继承,对吧?)。

ActiveRecord::Base可以看到here

  

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

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

-

由于您的modelClassActiveRecord基本上会使用您的数据库中的值创建一系列setter/getter instance methods

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

答案 1 :(得分:4)

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

  

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

  

然后,我们首先创建SQL表吗?

完全正确。 rails g model创建模型文件迁移,其中包含模型后面的表的声明。因此,在使用模型之前,必须先运行迁移。

  

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

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

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

中指定的自定义列
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}

答案 2 :(得分:1)

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

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

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

模型和表是相互关联的,模型可以作为实际数据的简单抽象层,以提供方便的工作和额外的验证等等。

答案 3 :(得分:0)

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

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

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

DESCRIBE table products;

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