Rails 3 неожиданное поведение JSON - PullRequest
1 голос
/ 07 сентября 2011

Модели

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 рассматривал этот столбец как вызов отношения (я могу понять, почему даже), а не просто столбец, это предполагаемое поведение?

1 Ответ

0 голосов
/ 07 сентября 2011

Я думаю, что вы правы в своем предположении о конфликте имен.На самом деле вы можете получить доступ к проекту вашей задачи вот так (task.project), поэтому, когда рендер JSON для rails рендерит task.project, он сносит JSON-представление своего отношения, как вы предполагаете.Я рекомендую вам изменить имя этого столбца, чтобы оно не конфликтовало с соглашением о рельсах, или вы можете изменить имя отношения, если не хотите изменять столбец базы данных (посмотрите на параметр :class_name), но это может вызвать еще большую путаницу в будущем.Я только что прочитал, что вы унаследовали этот код.Обычно, когда вы указываете отношения модели, вы автоматически получаете такие атрибуты, как project_id и вспомогательный метод project, который обращается к проекту задачи.Возможно, автор кода не знал об этом и чувствовал необходимость создать эти две колонки сам.Возможно, можно сохранить project_id, но атрибут project явно конфликтует.

Кроме того, вы можете переопределить представление JSON самостоятельно, определив метод в вашей модели с сигнатурой def as_json(options={}), которая возвращаетхеш, представляющий желаемое представление JSON, напр.{ :name => task.name, :project => something_else }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...