Как объединить две области с 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

2 ответы

Для этой функции запрашивается запрос на рельсы ( https://github.com/rails/rails/pull/ 9052 ), но в то же время кто-то создал патч обезьяны, который вы можете включить в свои инициализаторы, которые позволят вам или областям и где клаузулы в одном запросе, и все же дают вам ActiveRecord :: Отношение :

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

При этом вы сможете использовать OR

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

или написать новую область

scope :mother_of_all_feed, lambda{|user| tagfeed(user).or.friendfeed(user)}
0
добавлено
Некоторая конструктивная критика была бы оценена по тому, кто ее ниспроверг. Он решает проблему и не генерирует вложенные запросы.
добавлено автор keithepley, источник
ИЛИ будет добавлен в Rails 5.0: github.com/rails/rails/pull/16052
добавлено автор denis.peplin, источник
Да, OR был добавлен в ActiveRecord :: Relation # или в Rails 5 - nithinbekal.com/posts/rails-5-features
добавлено автор 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
добавлено
Не удовлетворены, но я просто прототипировал, так что все в порядке. Я посмотрю на squeel. Благодаря!
добавлено автор Vlad, источник
Удовлетворены ли вы его работой? Похоже, вы получаете здесь 4-5 запросов. Кажется, у вас есть два варианта: напишите сырой SQL-запрос или используйте мой любимый gem squeel. Он позволяет выполнять OR и поддерживает в , что приводит к вложенному SQL-запросу. Посмотрите: github.com/ernie/squeel . Я пытался «рекламировать» его несколько раз, например здесь: stackoverflow.com/a/10551561/1322562 , но только несколько людям это нравилось. Мне интересно, по
добавлено автор jdoe, источник
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

dbGeeks
dbGeeks
545 участник(ов)

Чат про базы данных, их устройство и приемы работы с ними. Разрешаются любые адеватные дискуссии в рамках тематики чата.

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

Разработка СУБД
Разработка СУБД
143 участник(ов)

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff