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

Commit 27ba66e5 by Sascha Depold

transaction support for 1:N association

1 parent 6b0d90dd
...@@ -77,31 +77,38 @@ module.exports = (function() { ...@@ -77,31 +77,38 @@ 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'
return new Utils.CustomEventEmitter(function(emitter) { return new Utils.CustomEventEmitter(function(emitter) {
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
if (associatedObject) { .save(
associatedObject[self.identifier] = instance[instanceKey] Utils._.extend(options, {
associatedObject fields: [self.identifier],
.save() allowNull: [self.identifier]
.success(function() { emitter.emit('success', associatedObject) }) })
.error(function(err) { emitter.emit('error', err) }) )
} else { .success(function() {
emitter.emit('success', null) if (associatedObject) {
} associatedObject[self.identifier] = instance[instanceKey]
}) associatedObject
.save(options)
.success(function() { emitter.emit('success', associatedObject) })
.error(function(err) { emitter.emit('error', err) })
} else {
emitter.emit('success', null)
}
})
} else { } else {
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 })
...@@ -244,15 +275,15 @@ describe(Support.getTestDialectTeaser("HasOne"), function() { ...@@ -244,15 +275,15 @@ describe(Support.getTestDialectTeaser("HasOne"), function() {
describe("Association column", function() { describe("Association column", function() {
it('has correct type for non-id primary keys with non-integer type', function(done) { it('has correct type for non-id primary keys with non-integer type', function(done) {
var User = this.sequelize.define('UserPKBT', { var User = this.sequelize.define('UserPKBT', {
username: { username: {
type: Sequelize.STRING type: Sequelize.STRING
} }
}) })
, self = this , self = this
var Group = this.sequelize.define('GroupPKBT', { var Group = this.sequelize.define('GroupPKBT', {
name: { name: {
type: Sequelize.STRING, type: Sequelize.STRING,
primaryKey: true primaryKey: true
} }
...@@ -293,4 +324,4 @@ describe(Support.getTestDialectTeaser("HasOne"), function() { ...@@ -293,4 +324,4 @@ describe(Support.getTestDialectTeaser("HasOne"), function() {
}) })
}) })
}) })
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!