2011-09-07 55 views
1

模型Rails 3个的意外JSON行为

class Project 
has_many :tasks 

class Task 
belongs_to :project 

Task具有以下属性(其中包括)

t.string project 
t.integer project_id 

这是我继承的代码,我不知道为什么它有两列,但我注意到这个设置出现意外的行为。当我渲染JSON用于@task,它包括project信息本身(可能无法正确格式JSON,但你的想法)

{ 
    "task": { 
    "duration": 3, 
    "project": { 
     "project": { 
     "id": 9, 
     "description": "Roofing, 
     "updated_at": "2011-09-07T16:58:34Z", 
     ... 
     } 
    }, 
    "project_id": 9, 
    ... 
    } 
} 

我检查数据库project列,它是零。看起来Rails像关系调用那样处理了这个列(我可以看到为什么),而不仅仅是一列,那是否意味着行为?

+0

什么是“项目”栏(字符串类型)?我看你有外键'project_id',看起来是正确的。 – dwhalen

+0

是的,如上所述,'project'列的类型是'string'。 –

+0

对不起,不清楚,我的意思是“什么是项目专栏?”,它存储了什么数据?我在说(键入字符串)来区分它与integer类型的'project_id'。显然'project'是一个字符串。 – dwhalen

回答

0

我认为你在命名冲突的假设中是正确的。实际上你可以像这样访问你的任务项目(task.project),所以当rails JSON渲染器呈现task.project时,它会像你猜测一样拉下它的关系的JSON格式。我建议您将该列的名称更改为不与rails的惯例冲突,或者如果您不想更改数据库列(请参阅:class_name选项),但可以更改关系的名称,但可能会导致更多混淆马路。我刚刚读到你继承了那个代码。通常,当您指定模型关系时,您将自动获取诸如project_id之类的属性以及访问任务项目的助手方法project。也许代码的作者没有意识到这一点,并认为有必要自己创建这两列。保留project_id可能没问题,但project属性显然是相互冲突的。

或者,您可以自己重写JSON格式,方法是在您的模型中使用签名def as_json(options={})定义一个方法,该方法返回表示您希望的JSON格式的散列,例如。 { :name => task.name, :project => something_else }

+0

是的,我对名称冲突是正确的,我咨询了原始开发人员(他是Rails的新手),并确保没有真正用于'project'的列,我删除了它,现在它不再提取相关的'project'信息。 –