Rails模型属性位置

时间:2011-02-13 03:28:01

标签: ruby-on-rails activerecord

我正在使用Ruby on Rails tutorial并且只使用三个属性创建了一个Comment模型。

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

它生成了一个ActiveRecord类,其中包含post但不是commenterbody

class Comment < ActiveRecord::Base
  belongs_to :post
end

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

3 个答案:

答案 0 :(得分:2)

Rails根据数据库模式动态加载属性 - 具体来说,列的名称及其类型。无需在模型中定义或声明它们。对于在生产中运行的应用程序,它会在加载时执行一次。对于开发,它会像每个请求一样重新加载它们,但只在每个模型使用时加载它们。

但是,

Rails不会从数据库中推断出其他内容。例如,如果您要在name列上放置唯一索引,则不会自动向模型添加validates_uniqueness_of :name。当然,在保存记录时,数据库仍会强制执行此约束,如果名称字段包含重复值,则会引发异常。在这种情况下,建议是两者都做。

答案 1 :(得分:1)

  
    

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

  

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

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

答案 2 :(得分:1)

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

但是,您可以查看生成的“db / schema.rb”,它是所有迁移的聚合。它包含所有activerecord模型的模式定义。这可能是你最好的选择。

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