gpt4 book ai didi

ruby-on-rails - rails 4 : How to use includes() with where() to retrieve associated objects

转载 作者:数据小太阳 更新时间:2023-10-29 06:29:38 26 4
gpt4 key购买 nike

我不知道如何使用 .where()检索关联模型数据的方法。在此示例中,项目 belongs_to 用户...

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} ) 但这不像是“The Rails Way”。什么是?

解决方案我最初的问题是在不正确的假设下提出的 debug()将返回关联的对象(这在 cakePHP 中有效,因为它将所有内容捆绑到数组中)。

所以我的原始代码应该 可以工作。但是,我错误地命名了表中归档的外键。查看迁移方法我感到困惑 t.belongs_to (它会自动创建正确命名的 foreign_key 字段,不是名为“belongs_to”的字段)。所以我还必须将该列重命名为 user_id现在它就像下面@V​​eraticus 的回答中描述的那样工作。

最佳答案

user对象不是 project 的一部分对象,因此您将无法在项目中查看它:而是说 Project.includes(:user) ,您告诉 Rails 在找到项目时预先加载引用的关联。这为您节省了数据库调用的时间。例如,非热切地:

@project = Project.where(id: params[:id]).first # one database call, fetching the project
@project.user # another database call, fetching the user

热切地:

@project = Project.includes(:user).where(id: params[:id]).first # one database call, fetching both project and user
@project.user # no database interaction

这对 has_many 更重要预加载关联可以节省 N+1 个数据库查询的查询。

您可以通过调用 @project.user 来验证它是否正常工作在急切加载和检查日志后的某个时刻:您应该看到此时没有数据库调用。

关于ruby-on-rails - rails 4 : How to use includes() with where() to retrieve associated objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18449209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com