模型
class Project
has_many :tasks
class Task
belongs_to :project
Task
具有以下属性(等等)
t.string project
t.integer project_id
这是我继承的代码,我不确定为什么它有两个列,但我注意到这个设置有一个意外的行为。当我为@task
呈现JSON时,它包含project
信息(可能没有正确格式化JSON,但你明白了)
{
"task": {
"duration": 3,
"project": {
"project": {
"id": 9,
"description": "Roofing,
"updated_at": "2011-09-07T16:58:34Z",
...
}
},
"project_id": 9,
...
}
}
我检查了数据库中的project
列,结果为零。好像Rails将该列视为关系调用(我可以看到为什么是偶数)而不仅仅是一列,是否是预期的行为?
答案 0 :(得分:0)
我认为你在假设命名冲突方面是正确的。您可以实际访问任务的项目(task.project
),因此当rails JSON渲染器渲染task.project
时,它会像您推测的那样拉下其关系的JSON再现。我建议您将该列的名称更改为不与rails的约定冲突,或者如果您不想更改数据库列,则可以更改关系的名称(请查看:class_name
选项),但它可能会更改在路上造成更多混乱。我刚刚读到你继承了那段代码。通常,当您指定模型关系时,会自动获取访问任务项目的project_id
和辅助方法project
等属性。也许代码的作者没有意识到这一点,并认为有必要自己创建这两个列。保留project_id
可能没问题,但project
属性明显存在冲突。
或者,您可以通过在模型中使用签名def as_json(options={})
定义一个方法来自行覆盖JSON再现,该签名返回表示所需JSON格式的散列,例如。 { :name => task.name, :project => something_else }
。