2016-04-21 8 views
1

Ich mache eine Website, wo nach der Anmeldung der Benutzer wählt, was ihre Interessen sind. So sieht der Benutzer nur die Beiträge, die für ihn relevant sind. Die Beziehung zwischen dem Benutzer und den Interessen (in meinem Fall Tags) ist eine Viele-zu-Viele-Beziehung durch eine Join-Tabelle. Außerdem kann ein Benutzer einen Beitrag erstellen und dem Beitrag Tags hinzufügen. Und ein Tag kann viele Beiträge haben. Die Beziehung zwischen Tags und Posts ist also eine Viele-zu-Viele-Beziehung durch eine Join-Tabelle. In der users Tabelle habe ich eine tag_ids Spalte, die eine Sammlung speichert. Gleiches mit der posts Tabelle, ich habe eine tag_ids Spalte, die eine Sammlung speichert.Erhalten Sie alle Beiträge, die mit irgendeinem Interesse eines Benutzers markiert wurden

In meinem User-Modell habe ich

has_many :user_tags 
has_many :tags,:through => :user_tags 

In meinem Beitrag Modell Ich habe

has_many :post_tags 
has_many :tags,:through => :post_tags 

Wenn ich so etwas wie current_user.tag_ids habe ich so etwas wie [2, 3] bekommen würde. Und wenn ich so etwas wie Post.first.tag_ids mache, bekomme ich etwas wie . Hoffe, du bekommst das allgemeine Bild. Also, wie extrahiere ich alle Beiträge, wo eine der tag_ids für den aktuellen Benutzer in der Posts tag_ids Spalte mit aktiven Datensatz vorhanden ist, wenn es möglich ist. Danke

+0

Nur um zu klären, fragen Sie, wie Sie die allgemeinen tag_ids zwischen den current_user.tag_ids und post.tag_ids finden? – ZubatMan

+1

Yeah dann alle Beiträge anzeigen, die diese tag_id mit ihnen haben –

Antwort

2

Die einfachste Möglichkeit, die ich tun kann, ist einfach für beide Tag_ids current_user und Post zu suchen, finden Sie eine gemeinsame tag_ids zwischen den beiden, und die Abfrage Ihrer DB für die tatsächlichen Tags basierend auf diesen IDs. Hier ist eine einfache Durchmarsch durch die:

# Get the current_user's tags 
user_tags = current_user.tag_ids 

# Map over all of the existing posts and grab all tag_ids 
# Once you have them, flatten the result into a single array and make all values unique 
post_tags = Post.all.map { |p| p.tag_ids }.flatten.uniq 

# Find any common tags using '&' 
common = user_tags & post_tags 

können Sie dann gehen über die resultierende gemeinsame Array und finden jeden relevanten Tag mit dem enumerator .map Methode:

# Map over common and find the relevant tags - return them in a new array 
common.map do { |t_id| Tag.find(t_id) } 

der Ihnen die aktuellen Tag Objekte erhält .

+0

Ich möchte in das Posts-Modell schauen. Kein spezieller Beitrag. Ich habe 'Post.first.tag_ids' verwendet, um Ihnen einen Einblick zu geben, was für einen Datensatz zurückgegeben wird. Ich möchte alle Posts durchlaufen dann durchlaufen sie in der Display-Seite –

+0

Sie wollen also die allgemeinen Tags zwischen dem current_user tag_ids und einem Tag-ID über alle bestehenden Post? – ZubatMan

+0

Yeahp ... das ist es ... Wäre froh, wenn du mir helfen kannst, das herauszufinden –