在Ruby on Rails中如何从关联列获取唯一流派名称
解决Ruby on Rails中从关联表获取流派名称的问题
问题背景
开发Netflix克隆项目时,需从Movie表的关联字段获取对应的Genre表中的唯一流派名称。现有表结构:
Movie表
Title | Genre xxxx | 1 aaaa | 1 bbbb | 1 cccc | 1 zzzz | 2 dddd | 2 eeee | 2 gggg | 2
Genre表
id | name 1 | Action 2 | Romance
控制器中已定义:
@action = Movie.where(genre_id: 1)
尝试过的代码未得到预期的Action结果,反而返回ActiveRecord对象或错误。
错误原因分析
<%= @action.select(:genre_id).distinct %>:返回的是Movie的ActiveRecord关系对象,直接输出会显示对象的内存地址字符串,而非具体值。@action.first.genre_id.name:genre_id是整数类型,不存在name方法,需调用关联的Genre对象而非直接操作id字段。@action.select(:genre_id).first.name:仅查询了Movie表的genre_id字段,该Movie对象不包含name属性(name属于Genre表)。@action..select(:genre_id).distinct.as_json:语法错误(多了一个点),且返回的是Movie表的属性数据,未关联Genre表。
正确解决方案
第一步:确保模型关联正确
首先在模型中建立关联关系:
Movie模型
class Movie < ApplicationRecord belongs_to :genre end
Genre模型
class Genre < ApplicationRecord has_many :movies end
第二步:获取流派名称的几种方法
方法1:通过Movie关联对象直接获取
视图中直接调用关联的Genre对象的name属性:
<%= @action.first.genre.name %>
方法2:直接查询Genre表(更高效)
如果已知genre_id,直接查询Genre表比查询Movie表更高效:
# 控制器中 @genre = Genre.find(1)
视图中输出:
<%= @genre.name %>
方法3:批量获取唯一流派名称(适用于多genre_id场景)
如果需要从Movie集合中提取所有不重复的流派名称,可使用joins关联Genre表后pluck取名称:
# 控制器中 @unique_genre_names = @action.joins(:genre).pluck('genres.name').uniq
视图中输出第一个名称(对应当前场景):
<%= @unique_genre_names.first %>
内容的提问来源于stack exchange,提问作者Kelson Batista
相关产品推荐
相关产品推荐

