不要怂,就是干,撸起袖子干!

Commit 27ba66e5 by Sascha Depold

transaction support for 1:N association

1 parent 6b0d90dd
...@@ -77,7 +77,7 @@ module.exports = (function() { ...@@ -77,7 +77,7 @@ module.exports = (function() {
HasOne.prototype.injectSetter = function(obj) { HasOne.prototype.injectSetter = function(obj) {
var self = this var self = this
obj[this.accessors.set] = function(associatedObject) { obj[this.accessors.set] = function(associatedObject, options) {
var instance = this var instance = this
, instanceKeys = Object.keys(instance.daoFactory.primaryKeys) , instanceKeys = Object.keys(instance.daoFactory.primaryKeys)
, instanceKey = instanceKeys.length === 1 ? instanceKeys[0] : 'id' , instanceKey = instanceKeys.length === 1 ? instanceKeys[0] : 'id'
...@@ -86,11 +86,18 @@ module.exports = (function() { ...@@ -86,11 +86,18 @@ module.exports = (function() {
instance[self.accessors.get]().success(function(oldObj) { instance[self.accessors.get]().success(function(oldObj) {
if (oldObj) { if (oldObj) {
oldObj[self.identifier] = null oldObj[self.identifier] = null
oldObj.save([self.identifier], {allowNull: [self.identifier]}).success(function() { oldObj
.save(
Utils._.extend(options, {
fields: [self.identifier],
allowNull: [self.identifier]
})
)
.success(function() {
if (associatedObject) { if (associatedObject) {
associatedObject[self.identifier] = instance[instanceKey] associatedObject[self.identifier] = instance[instanceKey]
associatedObject associatedObject
.save() .save(options)
.success(function() { emitter.emit('success', associatedObject) }) .success(function() { emitter.emit('success', associatedObject) })
.error(function(err) { emitter.emit('error', err) }) .error(function(err) { emitter.emit('error', err) })
} else { } else {
...@@ -101,7 +108,7 @@ module.exports = (function() { ...@@ -101,7 +108,7 @@ module.exports = (function() {
if (associatedObject) { if (associatedObject) {
associatedObject[self.identifier] = instance[instanceKey] associatedObject[self.identifier] = instance[instanceKey]
associatedObject associatedObject
.save() .save(options)
.success(function() { emitter.emit('success', associatedObject) }) .success(function() { emitter.emit('success', associatedObject) })
.error(function(err) { emitter.emit('error', err) }) .error(function(err) { emitter.emit('error', err) })
} else { } else {
......
...@@ -21,6 +21,37 @@ describe(Support.getTestDialectTeaser("HasOne"), function() { ...@@ -21,6 +21,37 @@ describe(Support.getTestDialectTeaser("HasOne"), function() {
}) })
describe('getAssocation', function() { describe('getAssocation', function() {
it('supports transactions', function(done) {
Support.prepareTransactionTest(this.sequelize, function(sequelize) {
var User = sequelize.define('User', { username: Support.Sequelize.STRING })
, Group = sequelize.define('Group', { name: Support.Sequelize.STRING })
Group.hasOne(User)
sequelize.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Group.create({ name: 'bar' }).success(function(group) {
sequelize.transaction(function(t) {
group.setUser(user, { transaction: t }).success(function() {
Group.all().success(function(groups) {
groups[0].getUser().success(function(associatedUser) {
expect(associatedUser).to.be.null
Group.all({ transaction: t }).success(function(groups) {
groups[0].getUser({ transaction: t }).success(function(associatedUser) {
expect(associatedUser).to.be.not.null
t.rollback().success(function() { done() })
})
})
})
})
})
})
})
})
})
})
})
it('should be able to handle a where object that\'s a first class citizen.', function(done) { it('should be able to handle a where object that\'s a first class citizen.', function(done) {
var User = this.sequelize.define('UserXYZ', { username: Sequelize.STRING }) var User = this.sequelize.define('UserXYZ', { username: Sequelize.STRING })
, Task = this.sequelize.define('TaskXYZ', { title: Sequelize.STRING, status: Sequelize.STRING }) , Task = this.sequelize.define('TaskXYZ', { title: Sequelize.STRING, status: Sequelize.STRING })
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!