Rails中has_many through关联结构报错,架构存在什么问题?
问题1:关联配置错误
你当前报错的直接原因是user.rb中clients关联的source参数配置错误:source需要指定的是中间表(Arrangement)上定义的关联名,而非外键字段名。你的Arrangement中已经定义了belongs_to :client, class_name: 'User',所以要把user.rb里的对应行修改为:
has_many :clients, through: :client_arrangements, class_name: 'User', source: :client
修改后即可解决报错提示里找不到关联的问题。
问题2:查询写法错误
你控制器中的@user.clients.jobs写法不合法:@user.clients返回的是多个用户组成的集合,不能直接在集合对象上调用只有单个User实例才有的jobs关联方法。
你要获取当前用户所有客户发布的、且指定tutor_id为当前用户的工作,有两种实现方式:
- 方式1:新增关联简化查询
在user.rb中新增一行关联定义:
has_many :client_jobs, through: :clients, source: :jobs
控制器代码直接改为:
@jobs = @user.client_jobs.where(tutor_id: @user)
- 方式2:直接编写查询无需新增关联
控制器直接写:
@jobs = Job.where(client_id: @user.clients.select(:id), tutor_id: @user)
这个写法会自动生成子查询,性能和关联查询一致,不需要额外修改模型代码。
内容的提问来源于stack exchange,提问作者Bazley
相关产品推荐
相关产品推荐

