mongodbmeteormeteor-autoformmeteor-methods

How to save/update object in collection and embed object in object?


I have two collections Colors and Cars. In the car possibly to choose the color.

How to save/update object in collection so that embed Color object in Car object?

 Cars = new Mongo.Collection('cars');
    Cars.attachSchema(new SimpleSchema({
        colorId: {
            label: 'Color',
            type: String,
            autoform: {
                options: function () {
                    return Colors.find().map(function (p) {
                        return {label: p.colorName, value: p._id};
                    });
                },
                label: false
            }
        },

        color: {
            type: Object,
        },
        'color._id': {
            type: String,
            autoform: {
                omit: true,
            },
        },
        'color.colorName': {
            type: String,
            autoform: {
                omit: true,
            },
        },
        'color.colorCode': {
            type: String,
            autoform: {
                omit: true,
            },
        },
    }));


Colors = new Mongo.Collection('colors');
Colors.attachSchema(new SimpleSchema({
    colorName: {
        type: String,
        label: "Color Name",
        max: 20,
    },
    colorCode: {
        type: String,
        optional: true,
        label: "Color Code",
        autoform: {
            afFieldInput: {
                type: "color"
            }
        }
    },
}));

I try use AutoForm.hooks({ insertCarForm: {before: {

but it did not work


Solution

  • There are several ways that you can achieve this and the solution largly depends on any relevant packages that you might be using. It's hard to give a working example without seeing your existing code that creates new 'cards'. Nevertheless, here is an example using the core Meteor API.

    1. Assuming you have some form Template defined (which I have called 'manageCar'), you would do something like this.

    Define a Meteor Method to handle inserting/updating the Car.

    Meteor.methods({
      updateCar: function(carDoc) {
        check(carDoc, { /* carDoc schema */ });
    
        const color = Colors.findOne(carDoc.colorId);
        carDoc.color = color;
    
        if (carDoc._id) {
          Cars.update(carDoc._id, {
            $set: {
              colorId: carDoc.colorId,
              color: carDoc.color,      
            }
          })
        } else {
          Cars.insert(carDoc);
        }
      },
    });
    

    Add an event handler for the form submission that calls the defined Method.

    Template.manageCar.events({
      'click .js-save-car'(event, instance) {
        const data = {
          _id: event.target._id.value,
          colorId: event.target.colorId.value
        };
    
        Meteor.call('updateCar', data, function(error, result) {
          if (!error) {
            alert('Car updated successfully');
          }
        });
      }  
    });
    

    Long story short, you just need to make sure you have access to the Color id that you are saving for the Car and then make sure you perform a find on the Color collection to retrieve the necessary Color document, then use that for your Car insert or update.

    Let me know if you have any questions or need further explanation.