Cum combinați două domenii cu OR

Am un feed tag și un feed prieten. Vreau să combin aceste două și să construiesc feed-ul final "tot".

Pentru feed-ul prieten:

class Post < ActiveRecord::Base
  scope :friendfeed, lambda{|x| followed_by}

  def self.followed_by(user)
    where("user_id IN (?) OR user_id = ?", user.watched_ids, user.id)
  end
end

Pentru feedul de etichete:

class Post < ActiveRecord::Base
  scope :tagfeed, lambda{|x| infatuated_with}

  def self.infatuated_with(user)
    joins(:attachments).where("attachments.tag_id IN (?)", user.tags).select("DISTINCT pages.*")
  end
end

Și aș chema ceva de genul asta de la controlor (folosesc pietre Kaminari pentru paginare):

@tag_feed = Post.tagfeed(current_user).page(params[:page]).per(21)
@friend_feed = Post.friendfeed(current_user).page(params[:page]).per(21)

Acum vreau să am un feed universal, dar sunt pierdut. Scopurile sunt menite să se restrângă, dar în acest caz încerc să fac o operațiune SAU. Făcând lucruri de genul

@mother_of_all_feed = @tag_feed + @friend_feed

ar fi redundant și nu aș putea controla numărul de postări care apar pe o singură pagină. Cum pot face asta? Mulțumiri!

Apropo, pentru etichetele pe care le am asociație înființate astfel:

class Post < ActiveRecord::Base
  has_many :attachments
  has_many :tags, :through => :attachments
end

class Tag < ActiveRecord::Base
  has_many :attachments
  has_many :posts, :through => :attachments
end

class Attachment < ActiveRecord::Base
  belongs_to :tag
  belongs_to :post
end
0

2 răspunsuri

Există o solicitare de tragere a șinelor pentru această caracteristică ( https://github.com/rails/rails/pull/ 9052 ), dar între timp, unii au creat un patch de maimuță pe care îl poți include în inițialele care îți vor permite sau în scopuri și în care clauzele într-o singură interogare și îți dau un ActiveRecord :: relaţia :

https://gist.github.com/j-mcnally/250eaaceef234dd8971b

Cu asta, ai putea să te orientezi cu scopurile tale

Post.tagfeed(current_user).or.friendfeed(current_user)

sau să scrieți un nou domeniu de aplicare

scope :mother_of_all_feed, lambda{|user| tagfeed(user).or.friendfeed(user)}
0
adăugat
Unele critici constructive ar fi apreciate de la cine a scăzut acest lucru. Rezolvă problema și fără a genera interogări imbricate.
adăugat autor keithepley, sursa
SAU vor fi adăugate la Rails 5.0: github.com/rails/rails/pull/16052
adăugat autor denis.peplin, sursa
Da, OR a fost adăugat la ActiveRecord :: Relation # sau în Rails 5 - nithinbekal.com/posts/rails-5-features
adăugat autor leviathan, sursa

Răspunzând la propria mea întrebare. Cred că mi-am dat seama.

where("pages.id IN (?) OR pages.id IN (?)",
  Page.where(
      "user_id IN (?) OR user_id = ?",
      user.watched_ids, user.id
  ),
  Page
    .joins(:attachments)
    .where("attachments.tag_id IN (?)", user.tags)
    .select("DISTINCT pages.*")
)

Se pare că lucrează până acum, sperăm că asta este!

0
adăugat
Nu e mulțumit, dar eram doar prototip, deci e în regulă. Mă voi uita la squeel. Mulțumiri!
adăugat autor Vlad, sursa
Ești mulțumit de performanța sa? Se pare că primiți 4-5 interogări aici. Se pare că aveți două opțiuni: scrieți o interogare SQL anterioară sau folosiți squeelul meu bijuterie preferat. Acesta permite efectuarea OR și suportă caracterul în care duce la interogarea SQL imbricată. Aruncați o privire: github.com/ernie/squeel . Am încercat să-i "fac publicitate" de câteva ori, ca aici: stackoverflow.com/a/10551561/1322562 , dar numai puțini oamenii i-au
adăugat autor jdoe, sursa