2011-02-13 113 views
1

我正在通过Ruby on Rails tutorial工作,并仅创建了一个带有三个属性的Comment模型。Rails模型属性位置

rails generate model Comment commenter:string body:text post:references 

它产生一个ActiveRecord类post但不commenterbody

class Comment < ActiveRecord::Base 
    belongs_to :post 
end 

为什么rails没有正式定义除数据库迁移脚本以外的任何地方的非引用属性?

回答

2

Rails根据数据库模式动态加载属性 - 特别是列的名称及其类型 - 。无需在模型中定义或声明它们。对于在生产中运行的应用程序,它在加载时执行一次。对于开发,它将按照每个请求的频率重新加载它们,但仅在使用每个模型时加载它们。

尽管如此,Rails并不会从数据库中推断出其他东西。例如,如果您要在name列中放置唯一索引,则它不会自动将validates_uniqueness_of :name添加到您的模型中。当然,如果名称字段包含重复值,则在保存记录时数据库仍然会强制执行此约束,导致引发异常。在这种情况下,建议是要同时做到这两点。

1

为什么rails没有正式定义除数据库迁移脚本以外的任何地方的非引用属性?

那么,你需要在哪里“定义”呢?迁移是这些属性唯一重要的地方,因为它的责任是创建具有这些属性的数据库表。

如果您对具有类似参数的注释执行脚手架,它也会生成视图并使用属性。他们不需要在其他地方被“定义”。

1

你的问题的简短答案是“否”。即使迁移也不是一个明确的地方,因为可能会有许多与模型相关的迁移。

但是,您可能会看看生成的“db/schema.rb”,它是所有迁移的聚合。它包含所有主动记录模型的模式定义。这也许是你最好的选择。

另外,您可能需要使用https://github.com/ctran/annotate_models插件,在您的模型中插入注释以帮助您跟踪所有模型的属性。