2015-06-13 4 views
1

Я использую sailsJS для создания REST API, который использует преимущества чертежей.Полиморфные ассоциации с SailsJS

My Design имеет много ресурсов, в которых один является ресурс активов:

Asset (id, type, owner_type, owner_id, url); 

Это будет действовать в качестве отправной точки для размещения нескольких активов для любого другого ресурса в системе.

ie.

Ресурс пользователя может содержать несколько изображений и видео. Все эти записи хранятся в ресурсе ресурсов.

Asset (id, type, owner_type, owner_id, url); 
Asset (1, 'image', 'User', 1, 'http://path.to.image.com/abc.jpg'); 
Asset (2, 'video', 'User', 1, 'https://youtube.com/sdasd'); 
Asset (3, 'image', 'BlogPost', 20, 'http://path.to.image.com/blogpost.jpg'); 

Так в идеале, когда я делаю Получить пользователя по ID или получить все пользователи, я бы предпочел, чтобы получить соответствующие средства для этого объекта.

Его можно подготовить ответ, если я реализую два метода для GetOne и GetAll, но при потреблении чертежей его немного размыто.

ответ

2

Если вы правильно поняли, у вас есть модель пользователя, то у вас есть модель Asset.

Модель пользователя выглядит

//User.js 
module.exports={ 
    assets:{collection:'Asset',via:'owner_id'} 
} 

модель активов должно выглядеть

module.exports={ 
    type:'string', 
    owner_type:'string', 
    owner_id:{model:'User'}, 
    url:'string' 
} 

Вы не сможете использовать план непосредственно, но вы могли бы сделать что-то вроде этого:

//UserController.js 
module.exports={ 
    findOne:function(req,res){ 
     User.findOne(req.param.id).populate('assets',{owner_type:'User'}).exec(function(data){res.json(data)}); 
    }, 
    find:function(req,res){ 
     User.find().populate.....//same idea 
    } 

} 

Этот параметр заполнения {owner_type} - это параметры заполнения, так что он только popu в конце сбора активов, у которого есть owner_type «Пользователь», вы также можете указать лимит, например, документацию here, к сожалению, я не нашел официальную документацию для этого, паруса и ватерлиния по-прежнему являются молодой структурой, множеством нечетких документов и но я думаю, что вы сделали правильный выбор для его использования. Дайте мне знать, если это поможет.

EDIT: Это просто работа с пользователем, если у вас есть модель блога необходимо также заполнить его, то вы можете сделать это вручную

//Blog.js 
var Promise=require('bluebird'); 
module.exports={ 
    findOne:function(req,res){ 
     Promise.all([Blog.findOne(req.param.id), 
     Asset.find({owner_id:req.param.id,owner_type:'blog'})]) 
     .spread(function(blog,assets){ 
      blog.assets=assets 
      return req.json(blog); 
     }) 
    } 
} 
+0

Существует также некоторые официальные документы здесь, которые могут помочь: HTTP://sailsjs.org/#!/documentation/concepts/ORM/Associations/OnetoMany.html – HeadCode

+0

@ Evilsanta well owner_id не всегда является пользователем, он изменится. Таким образом, в основном 1 вариант использования может представлять собой активы, принадлежащие Пользователю, а для другого это могут быть активы, принадлежащие блоге. Файл owner_type сохранит тип модели (User, BlogPost) –

+0

@GayanL да, я боюсь, вы можете выбрать только один, чтобы заполнить коллекцию. Мой пример позволяет вам получать активы пользователя, но вы не сможете делать Blogpost.populate. Извините за это разочарование, но вы можете вручную сделать это с помощью двухэтапного процесса. Сообщите мне, нужна ли вам дополнительная помощь. – Evilsanta

Смежные вопросы