23/09/2018, 17:19

Tìm hiểu về gem acts_as_votable

Acts_as_follower là một Ruby Gem được viết riêng cho các mô hình Rails / ActiveRecord nhằm phục vụ cho việc giải quyết các chức năng như like, dislike, vote up, vote down một cách nhanh chóng ... Thêm dòng sau vào Gemfile, sau đó chạy lệnh bundle install: gem 'acts_as_votable' , '~> ...

Acts_as_follower là một Ruby Gem được viết riêng cho các mô hình Rails / ActiveRecord nhằm phục vụ cho việc giải quyết các chức năng như like, dislike, vote up, vote down một cách nhanh chóng ...

Thêm dòng sau vào Gemfile, sau đó chạy lệnh bundle install:

gem 'acts_as_votable', '~> 0.11.1'

Tiếp đến chạy lệnh sau để thực thi :

rails generate acts_as_votable:migration
rake db:migrate

Votable Models

class Post < ActiveRecord::Base
  acts_as_votable
end

@post = Post.new(:name => 'my post!')
@post.save
@post.liked_by @user
@post.votes_for.size # => 1

Like/Dislike Yes/No Up/Down

Dưới đây là một số ví dụ về voting:

@post.liked_by @user1
@post.downvote_from @user2
@post.vote_by :voter => @user3
@post.vote_by :voter => @user4, :vote => 'bad'
@post.vote_by :voter => @user5, :vote => 'like'

Theo mặc định vote sẽ là 'like'. Do đó @user3 đã vote 'like' cho @post. @user1, @user3 @user5 tất cả đã vote 'like' cho @post. @user2 và @user4 đã vote 'bad' cho @post. Các từ khóa sau đây cũng có ý nghĩa như là vote giống như là ủng hộ hay chống lại. Up/Down, Like/Dislike, Positive/Negative...etc. Cờ booleannn sẽ được áp dụng. Ví dụ về phiếu ủng hộ:

@post.liked_by @user1
@post.vote_by :voter => @user3
@post.vote_by :voter => @user5, :vote => 'like'

Ví dụ về phiếu bầu phản đối:

@post.downvote_from @user2
@post.vote_by :voter => @user2, :vote => 'bad'

Đếm số phiếu bầu:

@post.votes_for.size # => 5
@post.weighted_total => 5
@post.get_likes.size # => 3
@post.get_upvotes.size # => 3
@post.get_dislikes.size # => 2
@post.get_downvotes.size # => 2
@post.weighted_score => 1

Active record cung cấp scope làm cho mọi thứ đơn giản hơn:

@post.votes_for.up.by_type(User)
@post.votes_for.down
@user1.votes.up
@user1.votes.down
@user1.votes.up.for_type(Post)

Mỗi lần scope hoàn thành, bạn có thể kích hoạt với mỗi 1 vote:

@post.votes_for.up.by_type(User).voters
@post.votes_for.down.by_type(User).voters

@user.votes.up.for_type(Post).votables
@user.votes.up.votables

Bạn cũng có thể bỏ vote khi đã vote trước đó:

@post.liked_by @user1
@post.unliked_by @user1

@post.disliked_by @user1
@post.undisliked_by @user1

Bỏ vote bao gồm cả phiếu bầu tích cực và phiếu bầu phủ định.

Ví dụ với scope

Bạn có thể thêm scope vào vote của bạn

# positive votes
@post.liked_by @user1, :vote_scope => 'rank'
@post.vote_by :voter => @user3, :vote_scope => 'rank'
@post.vote_by :voter => @user5, :vote => 'like', :vote_scope => 'rank'

# negative votes
@post.downvote_from @user2, :vote_scope => 'rank'
@post.vote_by :voter => @user2, :vote => 'bad', :vote_scope => 'rank'

# tally them up!
@post.find_votes_for(:vote_scope => 'rank').size # => 5
@post.get_likes(:vote_scope => 'rank').size # => 3
@post.get_upvotes(:vote_scope => 'rank').size # => 3
@post.get_dislikes(:vote_scope => 'rank').size # => 2
@post.get_downvotes(:vote_scope => 'rank').size # => 2

# votable model can be voted under different scopes
# by the same user
@post.vote_by :voter => @user1, :vote_scope => 'week'
@post.vote_by :voter => @user1, :vote_scope => 'month'

@post.votes_for.size # => 2
@post.find_votes_for(:vote_scope => 'week').size # => 1
@post.find_votes_for(:vote_scope => 'month').size # => 1

Thêm trọng số vào những lần vote của bạn

Bạn có thể thêm trọng số vào lần vote của bạn, giá trị mặc định là 1

# positive votes
@post.liked_by @user1, :vote_weight => 1
@post.vote_by :voter => @user3, :vote_weight => 2
@post.vote_by :voter => @user5, :vote => 'like', :vote_scope => 'rank', :vote_weight => 3

# negative votes
@post.downvote_from @user2, :vote_scope => 'rank', :vote_weight => 1
@post.vote_by :voter => @user2, :vote => 'bad', :vote_scope => 'rank', :vote_weight => 3

# tally them up!
@post.find_votes_for(:vote_scope => 'rank').sum(:vote_weight) # => 6
@post.get_likes(:vote_scope => 'rank').sum(:vote_weight) # => 6
@post.get_upvotes(:vote_scope => 'rank').sum(:vote_weight) # => 6
@post.get_dislikes(:vote_scope => 'rank').sum(:vote_weight) # => 4
@post.get_downvotes(:vote_scope => 'rank').sum(:vote_weight) # => 4

The Voter

Act_as_voter cung cấp chức năng lưu trữ những người voters mà bạn có.

class User < ActiveRecord::Base
  acts_as_voter
end

@user.likes @article

@article.votes.size # => 1
@article.likes.size # => 1
@article.dislikes.size # => 0

Để kiểm tra xem liệu một người vote có vote cho một model, bạn có thể dùng voted_for?Ngoài ra bạn có thể kiểm tra những người vote đã được vote như thế nào thông qua voted_as_when_voted_for.

@user.likes @comment1
@user.up_votes @comment2
# user has not voted on @comment3

@user.voted_for? @comment1 # => true
@user.voted_for? @comment2 # => true
@user.voted_for? @comment3 # => false

@user.voted_as_when_voted_for @comment1 # => true, user liked it
@user.voted_as_when_voted_for @comment2 # => false, user didnt like it
@user.voted_as_when_voted_for @comment3 # => nil, user has yet to vote

Bạn cũng có thể kiểm tra xem người vote đã bỏ phiếu ủng hộ hay ko ủng hộ.

@user.likes @comment1
@user.dislikes @comment2
# user has not voted on @comment3

@user.voted_up_on? @comment1 # => true
@user.voted_down_on? @comment1 # => false

@user.voted_down_on? @comment2 # => true
@user.voted_up_on? @comment2 # => false

@user.voted_up_on? @comment3 # => false
@user.voted_down_on? @comment3 # => false

Những định danh cho phương thức: voted_up_on?, voted_down_on? là: voted_up_for?, voted_down_for?, liked? và disliked?.

Dĩ nhiên, bạn có thể có được một danh sách các đối tượng người dùng đã thực hiện hành động vote cho cái gì đó. Cái danh sách này sẽ trả về một cái đối tượng thực tế (actual object) thay vì là thể hiện của model Vote. Tất cả các đối tượng đều là eager loaded.

@user.find_voted_items

@user.find_up_voted_items
@user.find_liked_items

@user.find_down_voted_items
@user.find_disliked_items

Các thành phần của một model riêng lẻ cái mà người dùng đã vote cũng có thể được hiển thị. Kết quả sẽ là một mối quan hệ ActiceRecord.

@user.get_voted Comment

@user.get_up_voted Comment

@user.get_down_voted Comment

Registered Votes

Người vote có thể chỉ được vote 1 lần. Trong ví dụ này vote 2 lần là không được vì @user đã vote cho @shoe rồi

@user.likes @shoe
@user.likes @shoe

@shoe.votes # => 1
@shoe.likes # => 1

Để check nếu 1 vote được tính, hoặc đã đăng ký, dùng vote_registered? trên model sau khi vote. Ví dụ:

@hat.liked_by @user
@hat.vote_registered? # => true

@hat.liked_by => @user
@hat.vote_registered? # => false, because @user has already voted this way

@hat.disliked_by @user
@hat.vote_registered? # => true, because user changed their vote

@hat.votes.size # => 1
@hat.positives.size # => 0
@hat.negatives.size # => 1

Để cho phép các mục bị trùng lặp của một người vote, sử dụng lựa chọn duplicate. Cần chú ý rằng điều đó sẽ giới hạn một vài phương thức khác, nó không thể có nhiều vote trong trường hợp này.

@hat.vote_by voter: @user, :duplicate => true

https://github.com/ryanto/acts_as_votable

0