Rails中Movie模型的has_many自关联实现及相关操作咨询
Rails实现Movie模型的自关联推荐影片功能
要实现影片关联多个同类型推荐影片的功能,需要通过自关联多对多的方式搭建,以下是具体步骤:
1. 创建连接表迁移
首先需要生成中间连接表,存储影片与推荐影片的关联关系。
运行迁移生成命令:
rails generate migration CreateMovieRecommendations movie:references recommended_movie:references
打开生成的迁移文件(路径:db/migrate/[timestamp]_create_movie_recommendations.rb),补充唯一性索引避免重复关联:
class CreateMovieRecommendations < ActiveRecord::Migration[7.0] def change create_table :movie_recommendations do |t| t.references :movie, null: false, foreign_key: true t.references :recommended_movie, null: false, foreign_key: { to_table: :movies } t.timestamps end # 添加唯一性索引,防止同一影片重复推荐同一部电影 add_index :movie_recommendations, [:movie_id, :recommended_movie_id], unique: true end end
执行迁移:
rails db:migrate
2. 设置模型关联
在app/models/movie.rb中定义自关联关系,同时创建中间模型MovieRecommendation:
Movie模型
class Movie < ApplicationRecord # 关联当前影片发起的推荐记录 has_many :movie_recommendations, foreign_key: :movie_id, dependent: :destroy # 通过推荐记录关联到推荐影片 has_many :recommended_movies, through: :movie_recommendations, source: :recommended_movie # 可选:反向关联,查看哪些影片推荐了当前影片 has_many :reverse_movie_recommendations, class_name: 'MovieRecommendation', foreign_key: :recommended_movie_id, dependent: :destroy has_many :recommended_by_movies, through: :reverse_movie_recommendations, source: :movie end
MovieRecommendation模型
创建app/models/movie_recommendation.rb:
class MovieRecommendation < ApplicationRecord belongs_to :movie belongs_to :recommended_movie, class_name: 'Movie' end
3. 添加与管理推荐影片
添加推荐
直接通过关联方法为影片添加推荐:
# 假设已有两个影片实例 movie1 = Movie.find(1) movie2 = Movie.find(2) # 为movie1添加movie2作为推荐影片 movie1.recommended_movies << movie2 # 批量添加多个推荐影片 movie1.recommended_movies << [movie3, movie4]
查询推荐列表
# 获取movie1的所有推荐影片 movie1.recommended_movies # 获取推荐了movie2的所有影片 movie2.recommended_by_movies
移除推荐
# 移除movie1对movie2的推荐 movie1.recommended_movies.delete(movie2)
内容的提问来源于stack exchange,提问作者Michael E
相关产品推荐
相关产品推荐

