我来自Java背景,我开始学习Ruby on Rails。请考虑http://guides.rubyonrails.org/active_record_basics.html
中提到的以下代码class Product < ActiveRecord::Base
end
该指南提到这会创建一个映射到表产品的模型产品(使用ruby的复数机制)。它还提到,通过这样做,您还可以使用模型实例的属性映射该表中每行的列。&#39;
但是我们没有在模型Product中声明任何属性。它是如何知道它的属性是什么?
一个假设:表的每个属性都是作为模型的属性。这是真的吗?那么,我们首先创建SQL表吗?如果我稍后更改表(比如添加新列),它是否也会动态更改我的模型?
答案 0 :(得分:4)
它的工作原理如下:
class Product < ActiveRecord::Base
Product
被子类化为 ActiveRecord::Base
(你知道从Java继承,对吧?)。
ActiveRecord::Base
可以看到here:
Active Record对象不直接指定它们的属性,而是从中推断它们 #与其链接的表定义。添加,删除和更改属性 #和它们的类型直接在数据库中完成。任何变化都会立即反映在 #Active Record对象。将给定的Active Record类绑定到某个特定的映射 #database表会在大多数常见情况下自动发生,但可以为不常见的情况覆盖。
您可以阅读其他代码;简而言之,这意味着 ActiveRecord 使用SQL模式填充相应的属性。
-
由于您的model
是Class
,ActiveRecord
基本上会使用您的数据库中的值创建一系列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;
这为它提供了表格中字段的完整列表。它根据这些字段在类的每个实例中设置属性。