9

KONTEKST:Niestandardowy zakres na has_many,: poprzez stowarzyszenia (Szyny 4)

W moich użytkowników konfiguracji wielu społecznościach poprzez CommunityUser i Wspólnoty mają wiele postów poprzez CommunityPost. Jeśli następnie następuje, że użytkownicy mają wiele postów poprzez społeczności.

User.rb

has_many :community_users 
has_many :communities, through: :community_users 
has_many :posts, through: :communities 

Biorąc powyższe pod uwagę User.rb Calling "current_user.posts" zwraca posty z jednego lub większej liczby społeczności wspólnych z current_user.

PYTANIE:

szukam udoskonalić że stowarzyszenie tak, nazywając „current_user.posts” zwraca tylko te posty, których społeczności są kompletne podzbiór społeczności na current_user użytkownika.

Tak więc, biorąc pod uwagę current_user z community_ids z [1,2,3], wywołanie "current_user.posts" przyniosłoby tylko te posty, których tablica "community_ids" to 1, [2], [3], [1 , 2], [1,3], [2,3] lub [1,2,3].

Byłem badania zasięgów here, ale nie wydaje się, aby wskazać, jak osiągnąć ten cel z powodzeniem ...

Odpowiedz

9

Nicea pytanie ...

mojej najbliższej myśli:

-

ActiveRecord Association Extension

Są w zasadzie pozwalają tworzyć szereg metod dla stowarzyszeń , Co pozwala na ustalenie szczegółowych kryteriów, na przykład:

#app/models/user.rb 
has_many :communities, through: :community_users 
has_many :posts, through: :communities do 
    def in_community 
     where("community_ids IN (?)", user.community_ids) 
    end 
end 

-

Conditional Association

Można użyć warunków w związku, tak jak poniżej:

#app/models/user.rb 
has_many :posts, -> { where("id IN (?)", user.community_ids) }, through: :communities #-> I believe the model object (I.E user) is available in the association 

-

Source

I początkowo pomyślałem, że to byłoby najlepiej, ale patrząc na to głębiej, myślę, że to tylko jeśli chcesz używać innej nazwy asocjacji

Określa nazwę stowarzyszenie źródło wykorzystywane przez has_many: poprzez zapytania. Używaj go tylko wtedy, gdy nie można wywnioskować nazwy ze stowarzyszenia . has_many: subskrybenci, przez: subskrypcje będą wyglądały na: dla: subskrybentów lub subskrybentów w subskrypcji, chyba że podano źródło :.


Będąc szczery, to jest jedno z tych pytań, które potrzebuje trochę myśli

Po pierwsze, jak się masz przechowywania/wywołanie tablicę community_ids? Czy jest przechowywany w db bezpośrednio, czy jest dostępny za pośrednictwem metody ActiveRecord Model.association_ids?

Czekamy na dalszą pomoc!

+0

Witam, przepraszam za opóźnienie! Przyjąłem, że to pytanie zajęłoby trochę czasu, aby uzyskać odpowiedź, ponieważ wymaga pewnej uwagi, o czym wspomniałeś. Tak, używam Railsów i używam metod ActiveRecord dla community_ids. – neon

+0

Jak już wspomniano, użytkownik jest dostępny przy użyciu powiązania warunkowego: "has_many: posts, -> (user) {where (" id IN (?) ", User.community_ids)}, poprzez:: communities", ale w tym przypadku nie Muszę też jakoś sprawdzić społeczności każdego z posterunków? Po prostu głośno myślę. – neon

+0

Sidenote: robi "gdzie (" id IN (?) ", User.community_ids)" w ten sposób zwróci posty powiązane z DOWOLNYM JEDNYM "user.community_ids", zamiast zwracać posty związane ze społecznościami, które są kompletnym podzbiorem " user.community_ids " – neon

0

Nie pokazuj modelu i relacji definicje dla Community lub CommunityPost więc upewnij się, że masz has_many :community_posts a has_many :posts, through: :community_posts modelu Community i belongs_to :community i belongs_to :post na CommunityPost. Jeśli nie musisz niczego śledzić na ComunityPost, możesz po prostu użyć na Community i tabeli złącz communities_posts zawierającej tylko klucze obce community_id i post_id.

Zakładając, że masz skonfigurowane relacje, tak jak opisuję, powinieneś po prostu użyć current_user.posts, aby uzyskać relację, która może być dalej powiązana i która zwraca wszystkie posty dla wszystkich społeczności, z którymi jest związany użytkownik, gdy zadzwonisz pod numer .all. Wszelkie metody klasy (takie jak metody Zakres) zdefiniowany model post będzie również wywoływać z tej relacji tak, że jest miejsce, gdzie należy umieścić swoje udoskonalenia chyba że te udoskonalenia dotyczą tego Community lub CommunityPost w takim przypadku będzie można umieścić je na Community lub CommunityPost modele odpowiednio. W rzeczywistości rzadko potrzeba rozszerzenia relacji AR dla zakresów, ponieważ zazwyczaj chcesz również udoskonalić model niezależnie od modelu powiązanego, który możesz wykorzystać, aby się do niego dostać.