【发布时间】:2013-08-26 17:00:58
【问题描述】:
我不知道如何使用.where() 方法来检索关联的模型数据。在本例中,Projects belongs_to Users...
class Project < ActiveRecord::Base
belongs_to :user
has_many :videos
end
class User < ActiveRecord::Base
has_many :projects
end
class ProjectsController < ApplicationController
def invite
@project = Project.includes([:user]).where( {:hashed_id=>params[:id]} ).first
end
end
在 App/views/projects/invite.html.erg <%= debug( @project ) %> 返回:
--- !ruby/object:Project
attributes:
id: 22
name: Some Project Name
belongs_to: 1
instructions: Bla bla bla
active: true
max_duration: 2
max_videos:
created_at: 2013-08-26 15:56:50.000000000 Z
updated_at: 2013-08-26 15:56:50.000000000 Z
hashed_id: '1377532589'
不应该将关联的用户哈希/数组包含在其中吗?我知道我可以通过调用第二个find/where (@project.user = User.where( {:id=>@project.belongs_to}) 来手动添加它,但这不像“Rails 方式”。是什么?
解决方案
我最初的问题是在debug() 将返回关联对象的错误假设下制定的(这在 cakePHP 中有效,因为它将所有内容捆绑到数组中)。
所以我的原始代码应该工作。但是,我错误地命名了表中的外键。查看迁移方法t.belongs_to(它会自动创建正确命名的foreign_key 字段,不是一个名为“belongs_to”的字段),我感到困惑。所以我还必须将该列重命名为user_id,现在它的工作原理与下面@Veraticus 的回答中描述的一样。
【问题讨论】:
-
你到底想展示什么?您的意思是要显示@project.user 的调试输出吗?或者您是说您的
where和includes不起作用?如果您想显示user关联以进行调试,您是否尝试<%= debug(@project.user) %>而不执行额外的user.where...? -
如果您只有一个项目对象包含对我来说没有意义。包括选择几个项目并希望在只需一个查询中加载所有相应的用户时,是有道理的,这是你在做什么吗?或者你如何使用
includes,希望你记得 -
答案不再产生单个查询,但这种方法可以:blog.arkency.com/2013/12/rails4-preloading
标签: ruby-on-rails ruby associations ruby-on-rails-4