Rails : Self-Referential Association, ví dụ vào mô hình Friendship
TIL
633
Rails
33
White

Manh Truong Tuan viết ngày 24/10/2016

Bài toán là 1 mô hình kiểu mạng xã hội đơn giản, trong đó user nhấn vào 1 nút Add friend hoặc Follow để cho 1 user khác vào danh sách theo dõi ( để làm gì đó thì ko biết, chat hoặc như tweeter )
Các yêu cầu cơ bản bao gồm

  • Lấy ra danh sách user mà mình đã follow
  • Lấy ra danh sách những người follow mình

Tạo thêm 1 model friendship, trong đó user_idid của user follow theo user có idfriend_id

rails g scaffold friendship user_id:integer friend_id:integer
rake db:migrate

mode/user.rb

has_many :friendships
has_many :friends, :through => :friendships
has_many :followings, :foreign_key => 'friend_id', :class_name: => 'Friendship'
has_many :followers, :through => :followings, :source => :user

model/friendship.rb

belongs_to :user
belongs_to :friend, :class_name => 'User'

Add friends and remove friends
controllers\friendships_controller.rb

def create
  @friendship = current_user.friendships.build(:friend_id => params[:friend_id])
  if @friendship.save
    flash[:notice] = "Added friend."
    redirect_to root_url
  else
    flash[:error] = "Unable to add friend."
    redirect_to root_url
  end
end

def destroy
  @friendship = current_user.friendships.find(params[:id])
  @friendship.destroy
  flash[:notice] = "Removed friendship."
  redirect_to current_user
end

Add friend link in View

<%= link_to "Add Friend", friendships_path(:friend_id => user), :method => :post %>

Showing friends and followers

<h2>Friends</h2>
<ul>
  <%  @user.friends.each do |friend| do %>
    <li>
      <%= friend.username %>
    </li>
  <% end %>
</ul>

<p><%= link_to "Find Friends", users_path %></p>

<h2>Friended by Users</h2>
<ul>
  <%  @user.followers.each do |follower| %>
    <li><%= follower.username %></li>
  <% end %>
</ul>

Sources : [http://railscasts.com/episodes/163-self-referential-association]

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Manh Truong Tuan

8 bài viết.
6 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
5 4
Vài hôm trước, khi phải giải quyết một task liên quan đến việc phải thêm 1 vài thay đổi khá lớn cho một loạt các function có sẵn thì mình chợt nhớ ...
Manh Truong Tuan viết 7 tháng trước
5 4
White
3 3
Sử dụng Terminal hiệu quả hơn với tmux (Link) 1. Cài đặt bash $ sudo E addaptrepository ppa:pirho/dev $ sudo aptget update $ sudo aptget install...
Manh Truong Tuan viết 2 năm trước
3 3
White
2 0
Note về Regex Tổng hợp lại những kiến thức cơ bản về Regex mà mình đã được thực hành tại regexone.com Tìm kiếm đúng một chuỗi Cách này gần như ...
Manh Truong Tuan viết 2 năm trước
2 0
Bài viết liên quan
White
21 3
Giao diện lập trình ứng dụng, còn gọi là API (Application Programming Interface) là chương trình cho phép người dùng sử dụng các phương thức của mộ...
chuong2v viết hơn 3 năm trước
21 3
White
0 2
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 5 tháng trước
0 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
8 bài viết.
6 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!