Rails : Self-Referential Association, ví dụ vào mô hình Friendship
TIL
594
Rails
31
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
4 2
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 3 tháng trước
4 2
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 hơn 1 năm trước
3 3
White
1 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 gần 2 năm trước
1 0
Bài viết liên quan
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 1 tháng trước
0 2
White
19 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết gần 2 năm trước
19 1
White
1 1
Chào mọi người, hôm nay mình viết một bài TIL nhỏ về cách lấy độ phân giải của màn hình hiện tại đang sử dụng. xdpyinfo | grep dimensions Kết quả...
namtx viết 12 tháng trước
1 1
{{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á!