2014-05-10 1 views
1

의 협회 나는 내 Ember.js 응용 프로그램에서 다음과 같은 모델을 가지고있다. 다른 컨트롤러에서, 내가 이상적으로 다음과 같은 두 가지 이상의 속성이있을 것이다, 이제이 "B"를 컨트롤러 부르 자 :이 경우게으른 부하 모델

MyApp.Game = DS.Model.extend({ 
    season_type:   DS.attr('string'), 
    gamedate:    DS.attr('date'), 
    home_team_name:   DS.attr('string'), 
    visiting_team_name:  DS.attr('string'), 
    gametime:    DS.attr('string'), 
    home_team:    DS.belongsTo('team'), 
    visiting_team:   DS.belongsTo('team'), 
    home_team_pitcher:  DS.belongsTo('player'), 
    visiting_team_pitcher: DS.belongsTo('player'), 
    home_players:   DS.hasMany('player'), 
    visitor_players:  DS.hasMany('player'), 
    home_all_players:  DS.hasMany('player'), 
    visitor_all_players: DS.hasMany('player') 
}); 

, 나는 home_all_playersvisitor_all_players을 추가했습니다. 이 두 속성에서 전선을 가로 지르는 데는 상당한 양의 데이터가 있습니다. 고객이 직면 한 컨트롤러 A에이 데이터를 사용하는 것을 피하고 싶습니다. 반면 컨트롤러 B은 관리자가 home_all_playersvisitor_all_players에 액세스해야하는 관리 인터페이스이므로 MLB 팀의 라인업을 업데이트 할 수 있습니다.

이것을 처리하는 가장 깨끗한 방법은 무엇입니까? 루비 온 레일즈 (Ruby on Rails)를 사용하는 서버 쪽에서는 어떤 시리얼 루틴이 호출되는지에 따라 home_all_playersvisitor_all_players이 포함될 것입니다. 그러나 Ember.js 측면의 모델링은 동일하게 유지되므로이 문제를 해결하는 가장 좋은 방법은 무엇인지 모르겠습니다.

답변

0

사용자가 모든 전환 지연 또는 특정 UX를 경험할 것으로 예상되는 경우 특정 앱에 액세스 할 수 있어야하는 전체 앱 흐름과 상호 작용에 달려 있다고 생각합니다.

일반적으로 내 백엔드는 클라이언트에게 가장 편리한 API를 제공하므로 최고의 UX를 제공 할 수 있으며 임베디드 데이터, 사이드로드 된 리소스, 새로운 리소스 정의 등을 사용할 수 있습니다.

1) 서버가 자원을 직렬화하는 방법을 알고 위해 쿼리 PARAM 전송 : ...

나는 세 가지 방법에 비슷한 일을했다.

store.find('game', {id: 1, extend:'admin'}); 
store.find('game', {extend:'admin'}); 

2) 현재 사용자 인증을 기반으로 서버에서 자원의 직렬화 방법을 알 수 있습니다.

//the server response would be different based on the auth header 
store.find('game', 1); 
store.find('game'); 

3) 리소스를 확장하는 새로운 리소스를 포함하십시오.

MyApp.ExtendedGame = DS.Model.extend({ 
    game:     DS.belongsTo('game'), 
    home_all_players:  DS.hasMany('player'), 
    visitor_all_players: DS.hasMany('player') 
}); 
0

IMO 모델을 확장해야합니다. 이 경우

App.Game = DS.Model.extend({ 
    ... 
}); 

App.AdminGame = App.Game.extend({ 
    home_players:   DS.hasMany('player'), 
    visitor_players:  DS.hasMany('player') 
}); 

은 두 개의 컨트롤러와 AdminGameController, GameController, GameRoute 및 AdminGameRoute입니다 관련 경로를해야합니다.

관련 경로의 서버에서 적절한 모델을 얻어야합니다. Rails는 컨트롤러를 기반으로 올바른 모델을 반환해야합니다.

0

쿼리 매개 변수를 사용하고 레일 측면에서 ActiveModel::Serializer은 필드를 포함할지 여부를 결정합니다. 개수, 정렬 순서 등을 결정합니다. 클라이언트에서 다른 컨트롤러를 사용한다고 생각할 수도 있습니다. .

저는 많은 양의 데이터를 페이지 매김하는 유사한 기능을 구현하려고합니다.지금 당장 내 생각은 DS.ManyArray을 확장하고 loaded_count, total_count, offset 등을 포함하는 데이터를 meta에 추가하는 것입니다.이 모든 데이터는 API에서 반환 할 수 있습니다. 기본값은 20 개의 레코드를로드 한 다음 함수를 호출하여 더 많은 레코드를 추가하거나 창을 다른 범위로 이동하여 메모리를 제어 할 수 있습니다. 또는 쿼리 매개 변수를 통해 모두로드하십시오.

0

단일 모델에서 릴레이하는 대신 기본 등록 정보와 home_all_playersvisited_all_players 속성을 가진 계승 클래스를 사용하여 기본 클래스를 만들 수 있습니다.

를 들어

MyApp.Game = DS.Model.extend({ 
    season_type:   DS.attr('string'), 
    gamedate:    DS.attr('date'), 
    home_team_name:   DS.attr('string'), 
    visiting_team_name:  DS.attr('string'), 
    gametime:    DS.attr('string'), 
    home_team:    DS.belongsTo('team'), 
    visiting_team:   DS.belongsTo('team'), 
    home_team_pitcher:  DS.belongsTo('player'), 
    visiting_team_pitcher: DS.belongsTo('player'), 
    home_players:   DS.hasMany('player'), 
    visitor_players:  DS.hasMany('player') 
}); 

Controller_A 에 대한 동일 레일 모델 적용 Controller_B

MyApp.AdminGame = MyApp.Game.extend({ 
    home_all_players:  DS.hasMany('player'), 
    visitor_all_players: DS.hasMany('player') 
}); 

더 나은 OO 접근법 (IMHO)

이 될 것입니다.

class Game < ActiveModel::Serializer 
    ## Your code .. 

    def home_all_players 
    nil 
    end 

    def visitor_all_players 
    nil 
    end 

    ## Your code .. 
end 

처럼 현재의 모델을 변경하고 모델을 기존에 전무를 반환하지 않을 경우 해당 속성

class AdminGame < Game 
    def home_all_players 
    self.home_all_players 
    end 

    def visitor_all_players 
    self.visitor_all_players 
    end 
end 

와 관리자 (게임을 확장)를위한 새로운 모델을 만들 JSON 동안 이러한 속성을 제외 세우다. 이것을 참조하십시오 question