我正在使用Ruby on Rails tutorial并且只使用三个属性创建了一个Comment模型。
rails generate model Comment commenter:string body:text post:references
它生成了一个ActiveRecord类,其中包含post
但不是commenter
和body
。
class Comment < ActiveRecord::Base
belongs_to :post
end
为什么rails不会在数据库迁移脚本以外的任何地方正式定义非引用属性?
答案 0 :(得分:2)
Rails根据数据库模式动态加载属性 - 具体来说,列的名称及其类型。无需在模型中定义或声明它们。对于在生产中运行的应用程序,它会在加载时执行一次。对于开发,它会像每个请求一样重新加载它们,但只在每个模型使用时加载它们。
但是, Rails不会从数据库中推断出其他内容。例如,如果您要在name
列上放置唯一索引,则不会自动向模型添加validates_uniqueness_of :name
。当然,在保存记录时,数据库仍会强制执行此约束,如果名称字段包含重复值,则会引发异常。在这种情况下,建议是两者都做。
答案 1 :(得分:1)
为什么rails不会在数据库迁移脚本以外的任何地方正式定义非引用属性?
那么,你在哪里需要它们“定义”呢?迁移是这些属性最重要的地方,因为它的职责是创建具有这些属性的数据库表。
如果您对具有类似参数的注释执行脚手架,它还会生成视图,并且它将使用属性。它们不需要在其他任何地方“定义”。
答案 2 :(得分:1)
对你的问题的简短回答是“不”。即使迁移也不是一个明确的地方,因为可能存在许多与模型相关的迁移。
但是,您可以查看生成的“db / schema.rb”,它是所有迁移的聚合。它包含所有activerecord模型的模式定义。这可能是你最好的选择。
此外,您可能希望使用在模型中插入注释的https://github.com/ctran/annotate_models插件,以帮助您跟踪所有模型的属性。