ORM Entity - Удалить запись и добавить свойство - PullRequest
1 голос
/ 16 марта 2012

Я собираю искатель магазина, который работает на расстоянии от почтового индекса. Я делал это много раз, используя стандартные запросы и QoQ, но теперь пытался соединить их, используя cf9 ORM ... но, похоже, достиг предела моих возможностей с последним битом.

Я вытаскиваю сущность и обрабатываю ее. В конце мне нужно:

а. Удалить запись, если она не соответствует определенным критериям (расстояние больше указанного пользователем)

ИЛИ б. Добавьте новое свойство к записи, чтобы сохранить расстояние.

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

Лучший способ увидеть, что я пытаюсь сделать, это просмотреть полную функцию

Любые предложения с благодарностью !!

public function getByPostcodeRadius(required postcode="", 
                                        required radius=""){

        //set some initial vals
        rs = {};
        geo = New _com.util.geo().init(); 
        local.postcodeGeo = geo.getGeoCode("#arguments.postcode#, Australia");
        local.nearbyStores = "";
        local.returnStores = {};

        //load stores
        local.stores = entityload("stores");

        //loop over all stores and return list of stores inside radius
        for(i=1; i <= ArrayLen(local.stores); i++){

            store = {};
            store.id = local.stores[i].getID();
            store.geoCode = local.stores[i].getGeoCode();
            store.Lat = ListgetAt(store.geoCode,1);
            store.Lng = ListgetAt(store.geoCode,2);

            distance = geo.getDistanceByGeocode(local.postcodeGeo.Lat,local.postcodeGeo.Lng,store.Lat,store.Lng);


            //************************
            //HERE IS WHERE I AM STUCK.

            if (distance LT arguments.radius){

                //here I need to add a property 'distance' and set it's value
                local.stores[i].distance = distance; // this adds it to the object, but not with the PROPERTIES

            } else {

                // here i need to remove the store from the object as it's distance was greater than the one passed in
                arrayDeleteAt(local.stores,i); //this clearly isn't working, as positions are changing with each loop over

            }

        }

        return local.stores;
}

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

Если вы удалите объект из массива, это испортит ваш цикл.

Попробуйте выполнить цикл в обратном порядке:

var i = arrayLen( local.stores );
for ( i; i == 0; i-- )

Или зацикливание вот так

for ( var local.store in local.stores )

(Это грубый код, и, возможно, понадобятся некоторые настройки)

1 голос
/ 16 марта 2012

Я подхожу к этому под другим углом:

1) Вместо того, чтобы удалять из массива всех хранилищ те, которые не совпадают, я построил бы массив тех, которые делают и возвращают это.

2) Если расстояние является специфическим для каждого запроса, а не свойством объекта магазина, я бы не пытался добавить его в магазин, а просто «связал» его с конкретными данными, которые я возвращаю для этого поиск.

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

Вот как я могу его кодировать (не проверялось, потому что у меня нет вашего геокласса или кода сущности):

public array function getByPostcodeRadius(required postcode="", required radius=""){
hint="I return an array of structs each containing a store object within the requested radius and its distance from the requested post code"
// Geo settings
local.geo = New _com.util.geo().init(); 
local.postcodeGeo = local.geo.getGeoCode("#arguments.postcode#, Australia");
// initialise the array of structs to return, which will contain stores within the requested radius and their distance from the postcode
local.nearbyStores = [];
//load all stores
local.stores = entityload("stores");
//loop over all stores and add those inside the radius to the return array with their distance
for( var storeObject in local.stores ){
    // determine the lat-lng for this store
    local.storeLat = ListgetAt(storeObject.getGeoCode(),1);
    local.storeLng = ListgetAt(storeObject.getGeoCode(),2);
    // get the distance from the requested postcode
    local.distance = local.geo.getDistanceByGeocode(local.postcodeGeo.Lat,local.postcodeGeo.Lng,local.storeLat,local.storeLong);
    if (local.distance LT arguments.radius){
        // create a struct of the store object and its distance and add to the nearby stores array
        local.thisStore =   {
            store   =   storeObject
            ,distance   =   local.distance
        };
        ArrayAppend( local.nearbyStores,local.thisStore );
    }
}
return local.nearbyStores;
}
...