Batman.js模型编码问题

时间:2014-08-10 17:20:50

标签: ruby-on-rails coffeescript batman.js

我遇到了一个复杂模型关联的有趣问题。

我有一个项目,它有许多任务,以及它从中获取自己的信息的唯一任务。 (可以将任务转换为项目以在其下嵌入其他任务)

class Settr.Project extends Batman.Model
  @resourceName: 'projects'
  @storageKey: 'projects'

  @persist Batman.RailsStorage, serializeAsForm: false

  @belongsTo 'owner', name: 'User', inverseOf: 'projects'
  @belongsTo 'task',  inverseOf: 'project'
  @hasMany 'tasks'


  @encode 'task_id', 'owner_id'
  @encodeTimestamps()

任务模型可能属于项目的hasMany关系,或者如果它与“任务”相反,它可能会发挥一个hasOne关系。属性。

class Settr.Task extends Batman.Model
  @resourceName: 'tasks'
  @storageKey: 'tasks'

  @persist Batman.RailsStorage, serializeAsForm: false

  @belongsTo 'user'
  @belongsTo 'project', inverseOf: 'task', saveInLine: true
  @hasOne 'project'
  @hasMany 'entries', name: 'TaskEntry', inverseOf: 'task', saveInline: true

  @accessor 'lastEntry', ->
    @get('entries').reduce (a, b) ->
      (if a.created_at < b.created_at then a else b)

  @encode 'user_id', 'project_id'
  @encodeTimestamps()

将来我将实现重复任务的能力,并允许查看给定任务的历史记录。此模型由TaskEntry

表示
class Settr.TaskEntry extends Batman.Model
  @resourceName: 'entries'
  @storageKey: 'entries'

  @persist Batman.RailsStorage

  @PRIVACY_OPTIONS = ['is_public', 'is_private', 'is_follower']
  @DIFFICULTY_OPTIONS = ['','easy', 'moderate', 'hard']
  @STATUS_OPTIONS = ['incomplete', 'complete']

  @belongsTo 'task', inverseOf: 'entries'
  @urlNestsUnder 'task'

现在问题。当我想发布一个新项目时,我必须为项目嵌入一个新任务,并为该任务提供一个TaskEntry并设置其title属性。 (标题是唯一必填字段)

有趣的是,当我的项目格式如下:(与上面相同)

class Settr.Project extends Batman.Model
  @resourceName: 'projects'
  @storageKey: 'projects'

  @persist Batman.RailsStorage, serializeAsForm: false

  @belongsTo 'owner', name: 'User', inverseOf: 'projects'
  @belongsTo 'task',  inverseOf: 'project'
  @hasMany 'tasks'

  @encode 'task_id', 'owner_id'
  @encodeTimestamps()

我可以检索项目,但不能发布新项目。

如果我对&#39;任务进行编码&#39;在Project模型中,我可以成功发布,但我无法再检索。示例如下。

class Settr.Project extends Batman.Model
  @resourceName: 'projects'
  @storageKey: 'projects'

  @persist Batman.RailsStorage, serializeAsForm: false

  @belongsTo 'owner', name: 'User', inverseOf: 'projects'
  @belongsTo 'task',  inverseOf: 'project'
  @hasMany 'tasks'

  @encode 'task_id', 'owner_id', 'task'
  @encodeTimestamps()

Batman.js API Docs on @encode,我发现@encode可以像这样定制。

@encode 'myProperty',
  decode: (value, key, incomingJSON, outgoingObject, record) -> # returns a value to set on the record
  encode: (value, key, builtJSON, record) ->                    # returns a value to put into the JSON
  as: "my_property"                                             # overrides "myProperty" as the JSON key

但我不太确定这对我来说是否是正确的解决方案,或者我的问题是否在其他地方。如果这是我想要的解决方案,我该如何正确使用它?文档有点过头了。

谢谢!

1 个答案:

答案 0 :(得分:0)

这可能是由此命名冲突引起的:

@belongsTo 'project', inverseOf: 'task', saveInLine: true
@hasOne 'project'

project定义了两个访问者 - 我认为后者会覆盖前一个访问者。

您可以在不更改JSON API的情况下重命名hasOne关联:

@hasOne 'special_project', foreignKey: 'project_id'

(您必须提供foreignKey,否则默认为special_project_id