2013-03-06 2 views
3

У меня есть два класса анализа; Компании и рейтинги. Это отношения друг к другу. Компании могут иметь множество рейтингов. Это заявление, которое я бы выполнить в SQL:Parse.js + AngularJS проблема с реляционными данными приложения

SELECT Companies.name, Ratings.rating 
FROM Companies 
INNER JOIN Ratings 
ON Ratings.name_id = Companies.name_id 
ORDER BY Companies.name 

Я хочу эквивалент этого в синтаксический анализ, но я не уверен, как идти об этом. Вот что я в настоящее время пробовал:

function getRatings() { 
    var tableA = new Parse.Query(Companies); 
    var tableB = new Parse.Query(Ratings); 

    tableB.equalTo("name_id", tableA.name_id); 
    tableB.find({ 
    success: function(results) { 
     $scope.$apply(function() { 
     $scope.companies = results.map(function(obj) { 
      return { 
      id: obj.get("name_id"), 
      name: obj.get(tableA.name), 
      rating: obj.get("rating"), 
      parseObject: obj 
      }; 
     }); 
     }); 
    }, 
    error: function(error) { 
     alert("Error: " + error.code + " " + error.message); 
    } 
    }); 
} 

Я вызываю эту функцию, когда контроллер загружается. Этот код отображает рейтинг в моем выпуске, но не название компании.

Я пытаюсь получить все компании, перечисленные в объекте компаний, а затем сопоставить их со всеми рейтингами, которые они имеют в объекте рейтингов. Их общий ключ name_id. Это код, я использую в моем угловом зрении:

<div class="span12"> 
    <div ng-repeat="company in companies | filter: query | orderBy: orderList" 
     class="well company-description"> 
     <h1>{{company.name}}</h1> 
     <h3>Rating: {{company.rating}}</h3> 
    </div> 
</div> 

Если я способ покинуть базу на это, пожалуйста, дайте мне знать

ответ

5

Избавиться от name_id колонки в Ratings классе. Это не значит, что вы должны определять отношения, используя Parse.

Есть несколько вариантов выбора.

Вариант 1

Использование браузера данных Синтаксическая, добавить новый столбец под Companies класса, называется ratings. Он должен быть столбцом типа Relation и указывать на Ratings в качестве целевого класса. (Дайте мне знать, если вам нужно больше информации о том, как это сделать.)

Затем, при создании или редактировании компании, добавлять оценки следующим образом:

var Companies = Parse.Object.extend("Companies"); 
var Ratings = Parse.Object.extend("Ratings"); 

var company = new Companies({name: "Some Company"}); 
company.relation("ratings").add(new Ratings({stars: 5})); 
company.save(); 

Затем при запросе Companies, сделайте так следующим образом:

new Parse.Query(Companies).find({ 
    success: function(companies) { 
     for (var i = 0; i < companies.length; i++) { 
      companies[i].relation("ratings").query().find({ 
       success: function(ratings) { 
        // Finally, I have the ratings for this company 
       } 
      } 
     } 
    } 
}); 

Вариант 2

Использование браузера данных Синтаксическая, добавить новый столбец под Companies класс, называемый ratings. Это должен быть столбец типа Array.

Затем, при создании или редактировании компании, добавлять оценки следующим образом:

var Companies = Parse.Object.extend("Companies"); 
var Ratings = Parse.Object.extend("Ratings"); 

var company = new Companies({ 
    name: "Some Company", 
    ratings: [new Ratings({stars: 5})] 
}); 
company.save(); 

Затем при запросе Companies, сделать это следующим образом:

new Parse.Query(Companies).include("ratings").find({ 
    success: function(companies) { 
     // Yay, I have access to ratings via companies[0].get("ratings") 
    } 
}); 

include("ratings") говорит Разбор чтобы включить в него фактических объектов, а не указателей на объекты для данного ключа.

Заключения

Вариант 1 лучше, если вы ожидаете, чтобы иметь большое количество рейтингов для каждой компании, и если вы не планируйте на получение всех рейтингов каждый раз, когда вы запрашиваете компании.

Вариант 2 лучше, если количество рейтингов для каждой компании относительно невелико, и вы всегда хотите, чтобы оценки возвращались при запросе компаний.

+0

Спасибо, Лукас за ваш пост, теперь это намного больше смысла, как вы его описали. Тем не менее, я пробовал второй вариант, который вы указали здесь, но я, кажется, возвращаю неверные результаты. Он возвращает весь объект оценки, и мой рейтинг выводится следующим образом: «[{« stars »: 5,« objectId »:« V2NZoe64G2 »,« createdAt »:« 2013-03-08T18: 54: 05.372Z », , "updatedAt": "2013-03-08T18: 54: 05.372Z"}] ', используя ratings.stars, возвращает меня undefined. – Neil

+0

Значит, вам нужно только свойство 'stars', а не весь объект' rating'? – Lukas

+0

TBH, я не уверен. Я не совсем понимаю, что здесь происходит. Я думаю, что «рейтинги» для этой компании добавляются к объекту «рейтинги» правильно? В конце концов, я хочу получить средний рейтинг ... добавьте все «звезды» вверх, разделите их на общую сумму «оценок». – Neil

1

Я узнал, как разрешить ошибку Uncaught You can't add an unsaved Parse.Object to a relation..

var addRating = new Ratings({stars: rating}); // save rating first, then associate it with a company 
    addRating.save({ 
     success: function() { 
      var addCompany = new Companies({name: name}); 
      addCompany.relation("ratings").add(addRating); 
      addCompany.save(); 
     } 
    }); 

Оценка должен быть сохранен первым, тем отношение компании может быть добавлено позже ... имеет смысл, но взял меня некоторое время, чтобы понять это! : S

+0

Полезно знать! Вы столкнулись с множеством головных болей с угловатым и parse.com? Я спрашиваю, потому что сейчас я сравниваю опции BaaS. – turbo2oh

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