我遇到了一个复杂模型关联的有趣问题。
我有一个项目,它有许多任务,以及它从中获取自己的信息的唯一任务。 (可以将任务转换为项目以在其下嵌入其他任务)
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
但我不太确定这对我来说是否是正确的解决方案,或者我的问题是否在其他地方。如果这是我想要的解决方案,我该如何正确使用它?文档有点过头了。
谢谢!
答案 0 :(得分:0)
这可能是由此命名冲突引起的:
@belongsTo 'project', inverseOf: 'task', saveInLine: true
@hasOne 'project'
为project
定义了两个访问者 - 我认为后者会覆盖前一个访问者。
您可以在不更改JSON API的情况下重命名hasOne
关联:
@hasOne 'special_project', foreignKey: 'project_id'
(您必须提供foreignKey
,否则默认为special_project_id
)