OR के साथ दो स्कोप कैसे गठबंधन करें

मेरे पास एक टैग फीड और एक दोस्त फ़ीड है। मैं इन दोनों को गठबंधन करना चाहता हूं और परम "सभी" फ़ीड बनाना चाहता हूं।

मित्र फ़ीड के लिए:

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

टैग फ़ीड के लिए:

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

और मैं नियंत्रक से ऐसा कुछ कहूंगा (मैं अंकन के लिए कामिनारी मणि का उपयोग कर रहा हूं):

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

अब मैं एक सार्वभौमिक फ़ीड चाहता हूं, लेकिन मैं खो गया हूं। स्कॉप्स को संकुचित करने के लिए हैं, लेकिन इस मामले में मैं एक या ऑपरेशन करने की कोशिश कर रहा हूं। सामान की तरह करना

@mother_of_all_feed = @tag_feed + @friend_feed

अनावश्यक होगा, और मैं एक पृष्ठ पर दिखाई देने वाली पोस्ट की संख्या को नियंत्रित करने में सक्षम नहीं होगा। मैं ऐसा कैसे कर सकता हूं? धन्यवाद!

वैसे, टैग के लिए मेरे पास इस तरह की स्थापना है:

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
जोड़ा संपादित
विचारों: 1

2 उत्तर

इस सुविधा के लिए रेल खींचने का अनुरोध है ( https://github.com/rails/rails/pull/ 9052 ), लेकिन इस बीच, किसी ने एक बंदर पैच बनाया है जिसे आप अपने प्रारंभिकरण में शामिल कर सकते हैं जो आपको एक स्केल में क्लोज़ करने और स्कॉप्स करने की अनुमति देगा और फिर भी आपको एक ActiveRecord :: रिलेशन :

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

इसके साथ, आप इस तरह के अपने स्कोप या करने में सक्षम होंगे

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

या एक नया दायरा लिखें

scope :mother_of_all_feed, lambda{|user| tagfeed(user).or.friendfeed(user)}
0
जोड़ा
कुछ रचनात्मक आलोचना की सराहना की जाएगी जो किसी ने इसे कम किया है। यह समस्या हल करता है, और नेस्टेड प्रश्न उत्पन्न किए बिना।
जोड़ा लेखक keithepley, स्रोत
या रेल 5.0 में जोड़ा जाएगा: github.com/rails/rails/pull/16052
जोड़ा लेखक denis.peplin, स्रोत
हां, OR को रेल कोड में ActiveRecord :: Relation # या में जोड़ा गया है - nithinbekal.com/posts/rails-5- विशेषताएं
जोड़ा लेखक leviathan, स्रोत

मेरे अपने सवाल का जवाब। मुझे लगता है कि मैंने एक रास्ता तय किया।

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.*")
)

ऐसा लगता है कि अब तक काम कर रहा है, उम्मीद है कि यह है!

0
जोड़ा
संतुष्ट नहीं, लेकिन मैं सिर्फ प्रोटोटाइप कर रहा था इसलिए यह ठीक है। मैं स्क्वायर पर एक नज़र डालेगा। धन्यवाद!
जोड़ा लेखक Vlad, स्रोत
क्या आप इसके प्रदर्शन से संतुष्ट हैं? ऐसा लगता है कि आपको यहां 4-5 प्रश्न मिलते हैं। ऐसा लगता है कि आपके पास दो विकल्प हैं: कच्चे एसक्यूएल-क्वेरी लिखें या मेरे पसंदीदा मणि स्क्वायर का उपयोग करें। यह में सुविधा को निष्पादित करने या समर्थन करने की अनुमति देता है जो नेस्टेड SQL क्वेरी की ओर जाता है। एक नज़र डालें: github.com/ernie/squeel । मैंने इसे कुछ बार "विज्ञापन" करने की कोशिश की, जैसे कि: stackoverflow.com/a/10551561/1322562 , लेकिन केवल कुछ ही ल
जोड़ा लेखक jdoe, स्रोत