2009-11-25 3 views
0

DataMapper와 조건부 연결을 만들 수 있습니까? 예를 들어DataMapper에는 조건이있는 n이 있습니다.

:

I은 ​​사용자가 n을 원하는 앱이 사용자는 속성이 같은 :developer => true

뭔가가 단지 경우 :

class User 
    include DataMapper::Resource 
    property :id, Serial 
    property :name, String, :nullable => false 
    property :screen_name, String, :nullable => false, :unique => true 
    property :email, String, :nullable => false, :unique => true, :format => :email_address 
    property :password, BCryptHash, :nullable => false 
    property :developer, Boolean, :default => false 

    #The user just gets apps if developer 
    has n :apps #,:conditions => "developer = 't'" 

end 

class App 
    include DataMapper::Resource 
    property :id, Serial 
    property :name, String, :nullable => false 

    belongs_to :user 
end 

나는이 만들어 가능할 것이다 것을 알고를 Developer :: User와 그 클래스에서 User의 하위 클래스 인 has n을 사용합니다.하지만 연관 선언에 직접 적용 할 수 있는지 알고 싶습니다.

또한 ARn을 사용할 때 내가 관리했던 또 다른 방법은 연결을 확장하고 각 작업에 대한 메서드를 다시 작성하는 것이 었습니다.

그래서 확장 모듈에 나는 이런 식으로 뭔가 할 수 :

module PreventDeveloperActions 
    def new 
    if proxy_owner.developer? 
     super 
    else 
     raise NoMethodError, "Only Developers can create new applications" 
    end 
    end 

# and so on for all the actions ... 
end 

을 그러나 다시, 난 정말이 솔루션을 가능하면 사용을 피하기 위해 싶지만, 그것은 빠른을 수행 할 수 그냥 경우 순간 미리

답변

2

에서 쉽게 DataMapper :

감사와 직접적인 방법, 당신은 관계 선언에 포함 조건은 대상에 적용됩니다. 따라서 대상 모델에 : active 속성이 있으면 has n, :apps, :active => true과 같은 것을 말할 수 있습니다. 불행히도 소스의 현재 상태가 주어지면 활성화 된 관계 만 정의 할 수는 없습니다.

DM의 쿼리 로직을 확장하려는 일부 제안이 있지만 코드에 어떤 영향이 있는지, 그리고이 기능을 제외하고는 어떤 추가 기능이 제공되는지는 확실하지 않습니다. 그것은 DM 1.0 이후 태클을 시도 할 수도 있습니다. DM 1.0 또한 50+ 어댑터와 플러그인에 영향을주기 때문입니다.

STI는 일반적으로 이러한 유형의 개체에 대해서만 존재하는 관계를 정의 할 수 있기 때문에 이와 같은 용도로 권장됩니다. 또 다른 방법은 관계를 정상적으로 정의하고 접근 자/변형 자 메서드를 비공개로 표시 한 다음 return apps if developer?에 해당하는 프록시 메서드를 추가하는 것입니다.

+0

안녕 댄, 관심과 지원을 주셔서 대단히 감사합니다, 그 정말 감사 : 내가 언급 한 이러한 방법을 시도합니다,하지만이게 내 문제를 해결할 것이라고 확신 :) 다시 한 번 감사드립니다 – zanona