MyFeeds

Help you implement feeds / timeline in rails application.

Installation

Add this line to your application’s Gemfile:

gem 'my_feeds'

And then execute:

$ bundle

Or install it yourself as:

$ gem install my_feeds

Usage

before usage

my_feeds need feeder, eater and associate model

feeder publish feeds

eater receive publish

and associate model create a relation between feeder and eater

yes, like subscribe and publish

feed model

feed model is what feeder published and eater subscribed, you can customize it.

rails generate my_feeds

associate model

rails generate my_feeds:likes #####use own associate model you can also use your own associate model.

just make sure your model have a polymorphic field for feeder.

and ``` class YourCustomModel < ActiveRecord::Base include MyFeeds::Associate #make sure include this module init_feeds_polymorphic = :likeable #and set this, in this case is likeable, it should same as the polymorphic belongs_to

#same as feeds_polymorphic belongs_to :likeable, polymorphic: true end

you should create a migration like below

# in this case, this column name is likeable_identity, it depends on feeds_polymorphic #add_column :your_customs, :likeable_identity, :string, null: false ```

feeder

include MyFeeds::Feeder in your model which will as feed source

ruby class User < ActiveRecord::Base ... include MyFeeds::Feeder ... end

now User get a method define_feed_event

use define_feed_event define your feed_event ```ruby class User < ActiveRecord::Base … include MyFeeds::Feeder

define_feed_event :hahahaha define_feed_event :kakakaka … end

in you rails console

user = User.create …

user get a method hahahaha…

#will create 3 feeds user.hahahaha user.hahahaha user.hahahaha

you can use source_feeds associate fetch your source feeds

user.source_feeds.count #=> 3

or scoped version

user.hahahaha_feeds.count #=> 3 user.kakakaka_feeds.count #=> 0

you can pass extra arguments to feed_event method, but must match feed model attributes

user.hahahaha target_id: another_user.id, target_type: another_user.class

user.source_feeds.last.target_id #=> another_user.id

you can also passed arguments with define_feed_event, then arguments will be default

… define_feed_event :hahahaha, target_type: User …

user.hahahaha target_id: another_user.id user.source_feeds.last.target_type #=> User ```

eater

include MyFeeds::Eater in your model which will as feed receiver

```ruby class User < ActiveRecord::Base … include MyFeeds::Eater has_many :likes #a eater must have associate with feeder

def feeds #eater have method feeds_for, pass associate and return feeds feeds_for likes end … end

sample

#create relation u = User.create like = u.likes.new like.likeable = another_user like.save like = u.likes.new like.likeable = Post.find … like.save u.feeds #=> you get feeds

feeds with scope??

class User < ActiveRecord::Base … include MyFeeds::Eater has_many :likes #a eater must have associate with feeder

def feeds #eater have method feeds_for, pass associate and return feeds feeds_for likes end

def teams_feeds feeds_for likes.where(likeable_type: Team) end

def users_posts_feeds feeds_for(likes.where likeable_type: User).where(target_type: Post) end … end ```

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request