NPM ORM - 保存 hasOne 字段的更新
Posted
技术标签:
【中文标题】NPM ORM - 保存 hasOne 字段的更新【英文标题】:NPM ORM - Save update of hasOne Field 【发布时间】:2015-04-15 09:07:33 【问题描述】:我有一个设置,我有一个在我的应用程序中具有特定角色的人。
我有以下型号
module.exports = function (orm, db)
var Person = db.define('person',
id: type: 'serial', key: true ,
name: type: 'text' ,
email: type: 'text' ,
password: type: 'text' ,
mobilenumber: type: 'text' ,
contract_id: type: 'integer' ,
role_id: type: 'integer' ,
status: type: 'integer' ,
);
Person.hasOne('role', db.models.role, autoFetch: true );
;
module.exports = function (orm, db)
var Role = db.define('role',
id: type: 'serial', key: true ,
name: type: 'text' ,
description: type: 'text' ,
);
;
当创建一个具有特定角色的新人时,一切正常并分配了角色。
创建具有角色的新用户
模板
extends layout
block content
div.container
div.row
form(id='user_form' action='create' method='post')
p name:
input(type='text' name='name')
p email:
input(type='text' name='email')
p password:
input(type='password' name='password')
p mobilenumber:
input(type='text' name='mobilenumber')
p role
select(size='5' name='role')
each role in roles
option(value="#role.id") #role
input(type='submit' value='add')
控制器
app.get('/new', function (req, res)
req.models.role.all(function (err, roles)
res.render('new', roles:roles);
);
);
app.post('/create', function (req, res)
var new_person = ;
new_person.name = req.body.name;
new_person.email = req.body.email;
new_person.password = req.body.password;
new_person.mobilenumber = req.body.mobilenumber;
new_person.role_id = req.body.role;
req.models.person.create(new_person, function (err, person)
if(err) throw err;
res.redirect('/person');
);
);
但是当我尝试更新一个条目时,每个更改的字段都会更新,除了 role_id
。
用角色更新现有用户
模板
extends layout
block content
div.container
div.row
form(id='user_form' action='/person/update/#person.id' method='post')
p name:
input(type='text' name='name' value='#person.name')
p email:
input(type='text' name='email' value='#person.email')
p password:
input(type='password' name='password')
p mobilenumber:
input(type='text' name='mobilenumber' value='#person.mobilenumber')
p role:
select(size='5' name='role')
each role in roles
option(value="#role.id") #role
input(type='submit' value='save')
控制器
app.get('/edit/:id', function (req, res)
req.models.person.get(req.params.id, function (err, person)
req.models.role.all(function (err, roles)
res.render('edit', person: person, roles: roles);
);
);
);
app.post('/update/:id', function (req, res)
req.models.person.get(req.params.id, function (err, person)
person.name = req.body.name;
person.email = req.body.email;
person.password = req.body.password;
person.mobilenumber = req.body.mobilenumber;
person.role_id = req.body.role;
console.log(req.body.role); // even prints the correct id when updated
person.save(function (err)
if(err) throw err;
res.redirect('/person');
);
);
我什至在更新字段时收到正确的role_id
。由于在更新中保存其他属性有效并且role_id
只是我不明白的人的属性,为什么这不可行。如果您需要更多代码,请告诉我。我现在真的被困住了。有人有同样的经历吗?
编辑:我什至尝试将其转换为 int 但这也没有改变任何东西person.role_id = parseInt(req.body.role);
【问题讨论】:
【参考方案1】:在这种情况下,我必须使用 setRole
来为 hasOne 关系保存条目。
app.post('/update/:id', function (req, res)
req.models.person.get(req.params.id, function (err, person)
person.name = req.body.name;
person.email = req.body.email;
if (req.body.password) person.password = req.body.password;
person.mobilenumber = req.body.mobilenumber;
req.models.role.get(req.body.role, function (err, role)
if(err) throw err;
person.setRole(role, function (err)
person.save(function (err)
if(err) throw err;
res.redirect('/person');
);
);
);
);
);
【讨论】:
【参考方案2】:for (var j in originEntity)
if (_.isObject(originEntity[j]))
delete originEntity[j];
请尝试一下,我认为原因是因为您仅在自动获取的对象仍然存在时更改了相关键。
【讨论】:
以上是关于NPM ORM - 保存 hasOne 字段的更新的主要内容,如果未能解决你的问题,请参考以下文章