run remove rails migrations generate data create column ruby-on-rails ruby-on-rails-3 database-design activerecord

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!