ruby on rails - remove - Cómo combinar dos ámbitos con O
remove migration rails (2)
Tengo un feed de etiquetas y un feed de amigos. Quiero combinar estos dos y construir el último "todo" de alimentación.
Para la alimentación de amigos:
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
Para el feed de etiquetas:
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
Y yo llamaría algo así del controlador (estoy usando la gema Kaminari para la paginación):
@tag_feed = Post.tagfeed(current_user).page(params[:page]).per(21)
@friend_feed = Post.friendfeed(current_user).page(params[:page]).per(21)
Ahora quiero tener un feed universal, pero estoy perdido. Los ámbitos están destinados a reducirse, pero en este caso estoy tratando de hacer una operación de quirófano. Haciendo cosas como
@mother_of_all_feed = @tag_feed + @friend_feed
sería redundante, y no podría controlar la cantidad de publicaciones que aparecen en una sola página. ¿Cómo puedo hacer esto? ¡Gracias!
Por cierto, para las etiquetas tengo una asociación configurada así:
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
Hay una solicitud de extracción de rieles para esta función ( https://github.com/rails/rails/pull/9052 ), pero mientras tanto, alguien ha creado un parche de mono que puede incluir en sus inicializadores que le permitirá o ámbitos y cláusulas where en una consulta y todavía le dan una relación ActiveRecord::Relation
https://gist.github.com/j-mcnally/250eaaceef234dd8971b
Con eso, podrías O tus ámbitos como este
Post.tagfeed(current_user).or.friendfeed(current_user)
o escribe un nuevo alcance
scope :mother_of_all_feed, lambda{|user| tagfeed(user).or.friendfeed(user)}
Respondiendo mi propia pregunta. Creo que descubrí una manera.
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.*")
)
Parece que está funcionando hasta ahora, ¡espero que sea esto!