def follow(other_user)
unless self == other_user #Trying to follow other_Verify that user is not himself
self.relationships.find_or_create_by(follow_id: other_user.id)
end
end
If there is data that meets the condition of the argument, return it find_by (other_user)
, otherwise create a new create (other_user)
Save after creating a new one
Reference article: What is the difference between find_or_initialize_by and find_or_create_by?
def following?(other_user)
self.followings.include?(other_user)
end
Method to judge whether the element specified by the argument is included in the array
class CreateRelationships < ActiveRecord::Migration[5.2]
def change
create_table :relationships do |t|
t.integer :follower_id
t.integer :following_id
t.timestamps null: false
add_index :relationships, :follower_id
add_index :relationships, :following_id
add_index :relationships, [:follower_id, :follwing_id], unique: true #follow_id and following_Setting to prevent the same combination of id
end
end
end
I understand that ʻadd_index adds an index, but what is the purpose of indexing in the first place? This article was helpful because I didn't understand the meaning of the description of ʻadd_index
.
Reference article: How to put an index in the database
To make it easier to find when retrieving data from columns. For example, in this case, to make it easier to search for followers from the follower column. I don't need to have only 3 people in the data, but when it comes to 10,000 people, it takes time to search, so it seems better to add it.
add_How to write index
add_index :table name,Column name
In the above example, it is the following_id column of the relation table and the following_id column of the relation table.
user.rb
has_many :follwing_relationships, foreign_key: "follower_id", class_name: "Relationship", dependent: :destroy
The follwing_relationships
model doesn't really exist. It's just set like this for convenience. This model is a model of the people who follow.
So follower_id
is set with a foreign key.
class_name:" Relationship "
As I said earlier, the follwing_relationships
model doesn't really exist, and it actually exists, so the name is follwing_relationships
. , The name alone really means "Relationship".
dependent:: destroy
This is fairly simple, and when a user disappears, the relationship with the people that the user is following disappears. The user model and the relationship model are dependent, and when the user disappears, the relationship (relationship between the user and follow_ids) of that user also disappears.
user.rb
has_many :follwings, through: :following_relationships
The association between models is defined by has_many: follwings (model name)
. through :: following_relationships
This shows an intermediate table. It's been mentioned several times, but the name is following_relationships
, but in reality relationships
is the intermediate table.
The point is that there is a relation model between the two user models, the user model (followed people) and the user model (followed people).
Especially note that 2. is easy to forget !! This time, following_id is required, but if you look at the above migration file, you can see that following_id is put there, but this time it is OK because it is defined there.
user.rb
def following?(other_user)
following_relationships.find_by(following_id: other_user.id)
end
def follow!(other_user)
following_relationships.create!(following_id: other_user.id)
end
def unfollow!(other_user)
following_relationships.find_by(following_id: other_user.id).destroy
end
The find_by
method returns only one. So, if you set this, you can pinpoint the user you want to find.
Reference article: [[Rails] Various usages of the most detailed find_by method in the world](https://pikawaka.com/rails/find_by#find_by%E3%83%A1%E3%82%BD%E3%83% 83% E3% 83% 89% E3% 82% 92% E4% BD% BF% E7% 94% A8% E3% 81% 99% E3% 82% 8B% E5% A0% B4% E9% 9D% A2% E3% 81% A8% E3% 81% AF% EF% BC% 9F)
create!
means to save as it is.
The last one is to find one user and delete the .destroy
method, so delete that data.
What I still don't understand is why write methods in the model? Normally I thought that such a method would be written in the controller. When I searched, I found this article. How do I use the methods I wrote in the Rails model in the controller?
What I found out was to make the description of the controller as simple as possible. It seems like that. Certainly, if you write the above description in the controller, it will be confusing and difficult to understand.
Caused by: Mysql2 :: Error: Table'(app name) _development.relationships' doesn't exist
I searched for "migration Table doesn't exist" and found this article.
Reference article: Notes on migration files after migrating to Rails 5.1
routes.rb
resources :users do
member do
get :following, :followers
end
end
member
? What do you mean?Reference article: I tried to explain the difference between members and collection in routes.rb of rails in an easy-to-understand manner. ~ Rails from beginner to intermediate ~
following_user GET /users/:id/following(.:format) users#following
followers_user GET /users/:id/followers(.:format) users#followers
As you can see from the URL,: id will be added automatically.
Add a follow function with rails. I implemented the follow function while looking at this article. How to put an index in the database What is the difference between find_or_initialize_by and find_or_create_by? How do I use the methods I wrote in the Rails model in the controller?
Recommended Posts