2013-08-22 2 views
0

내 응용 프로그램에서 AccountHousehold 또는 User으로 소유 할 수 있습니다. 사용자는 자신이 소유 한 계정과 가구가 소유 한 계정에 액세스 할 수 있습니다. accessible_accounts을 정의했는데, 가정과 사용자 계정의 배열을 제공하지만 릴레이션과 같은 결과를 얻을 수있는 방법이 있습니다. 그래서 나는 더 이상의 조건문과 연결할 수 있습니까? 당신이 어떤을해야합니까,다형성을 집계하는 레일 has_many 관계

class User < ActiveRecord::Base 
    belongs_to :household 
    has_many :accounts, as: :ownable 
end 

class Household < ActiveRecord::Base 
    has_many :users 
    has_many :accounts, as: :ownable 
end 

class Account < ActiveRecord::Base 
    belongs_to :ownable, polymorphic: true 
end 

을 그런데 : 순서는 적절한 다형성 협회에서

class User < ActiveRecord::Base 
    has_many :accounts, as: :owner 

    belongs_to :household 

    def accessible_accounts 
    ua = accounts.to_a 
    ha = [] 
    if household 
     ha = household.accounts.to_a 
    end 
    (ua + ha).uniq 
    end 
end 

class Household < ActiveRecord::Base 
    has_many :users 
    has_many :accounts, as: :owner 
end 

class Account < ActiveRecord::Base 
    belongs_to :owner, polymorphic: true 
end 

답변

1

나는 이것에 생각의 몇 가지있다 :

첫째, 당신이 (가) Accounts 모델에 다음을 추가하여 Household을 통해 User가 가지고있는 Account 것을 표현할 수있다 : 그러나

has_many :accounts, through: household 

, 나는 이해 사용자가 연결된 세대를 통해 소유 한 계정으로 직접 소유 한 계정의 병합/통합을 나타내는 Relation이 필요합니다.

def accessible_accounts 
    Account.where(
    '(ownable_id = ? and ownable_type = ?) or (ownable_id = ? and ownable_type = ?)', 
    id, User.to_s, household_id, Household.to_s) 
end 

내가이 테스트를하지 않은,하지만 난 가서 공유 나는 경우 피드백 믿을 거라고 생각 : 그게 사실이라면, 나는 User에 추가 다음과 같은 방법은 당신이 원하는 걸 줄 것이라고 생각 뭔가 오해 했어.

+0

'당신은 합병/합집합을 나타내는 관계를 원한다. '- 올바른. 나는이 일이 가능할 것이라고 생각했지만, SQL에 그렇게 가까이 있지 않았 으면 좋겠다고 생각했다. – Zeophlite

+0

그래서 당신은 'has_many_aggregated [: accounts, : household_accounts], as : : accessible_accounts'와 같은 것을 생각하고 있었습니까? 그렇게 할 수는 있지만 "쓰기"방법이 문제가됩니다. –

0

중요하지 않은 (실제로 더 체인을 설정할 수 있습니다가) 나는 당신의 구조는 다음과 같은 것 생각입니다 인증을 위해 Devise 및 CanCan을 사용하지 않는 이유는 무엇입니까? & 인증?

+0

변경'ownable -> owner'는 아무 것도 변경하지 않습니다. 명확성을 위해 Devise 문을 제거했습니다. – Zeophlite

+0

첫째, 유일한 변경 사항은'owner-> ownable'가 아닙니다. 다형성 관련 연관성을'User' 모델에 추가했습니다. 둘째, 이미 CanCan을 사용하지 않은 특별한 이유를 사용한다면? https://github.com/ryanb/cancan/wiki/Defining-Abilities – scaryguy

+0

코드는 내 것과 정확히 같지만'owner'가'ownable'로 바뀌 었습니다. 내 코드에는 이미 연관성이 있습니다. CanCan을 필요로하지 않기 때문에 CanCan을 사용하지 않습니다. 모든 권한 부여는 컨트롤러가 처리 할 수있을 정도로 간단합니다. – Zeophlite