- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试从包含 5 个表的现有数据库生成一个 json 结构::用户:资源:quiz_questions:测验答案:quiz_responses
一个资源有很多 quiz_questions,它有很多 quiz_answers,然后有很多 quiz_responses。用户也有_许多测验_响应。 (这个想法是用户进行多项选择测验,然后他们选择现有答案,然后在 quiz_responses 中创建一个新行。
所以我有两行代码:
questions = QuizQuestion.includes(:quiz_answers, :quiz_responses).where(resource_id: 623, quiz_responses: {user_id: 18276})
产生这个查询:
SELECT
`quiz_questions`.`id` AS t0_r0,
`quiz_questions`.`question` AS t0_r1
`quiz_questions`.`resource_id` AS t0_r2,
`quiz_questions`.`created_at` AS t0_r3,
`quiz_questions`.`updated_at` AS t0_r4,
`quiz_questions`.`question_type` AS t0_r5,
`quiz_questions`.`url` AS t0_r6,
`quiz_questions`.`auto_next` AS t0_r7,
`quiz_questions`.`show_correct` AS t0_r8,
`quiz_questions`.`answer_type` AS t0_r9,
`quiz_answers`.`id` AS t1_r0,
`quiz_answers`.`answer` AS t1_r1,
`quiz_answers`.`quiz_question_id` AS t1_r2,
`quiz_answers`.`correct` AS t1_r3,
`quiz_answers`.`created_at` AS t1_r4,
`quiz_answers`.`updated_at` AS t1_r5,
`quiz_answers`.`answer_immediately` AS t1_r6,
`quiz_answers`.`time_limit` AS t1_r7,
`quiz_responses`.`id` AS t2_r0,
`quiz_responses`.`user_id` AS t2_r1,
`quiz_responses`.`quiz_answer_id` AS t2_r2,
`quiz_responses`.`created_at` AS t2_r3,
`quiz_responses`.`updated_at` AS t2_r4,
`quiz_responses`.`attempt_id` AS t2_r5,
`quiz_responses`.`video_url` AS t2_r6,
`quiz_responses`.`correct` AS t2_r7,
`quiz_responses`.`group_id` AS t2_r8
FROM `quiz_questions`
LEFT OUTER JOIN `quiz_answers` ON `quiz_answers`.`quiz_question_id` = `quiz_questions`.`id`
LEFT OUTER JOIN `quiz_answers` `quiz_answers_quiz_questions_join` ON `quiz_answers_quiz_questions_join`.`quiz_question_id` = `quiz_questions`.`id`
LEFT OUTER JOIN `quiz_responses` ON `quiz_responses`.`quiz_answer_id` = `quiz_answers_quiz_questions_join`.`id`
WHERE
`quiz_questions`.`resource_id` = 623
AND `quiz_responses`.`user_id` = 18276
第二行代码:
questions.as_json(include: { quiz_answers: { include: [:quiz_responses]}})
调用这些额外的查询:
QuizResponse Load (0.8ms) SELECT `quiz_responses`.* FROM `quiz_responses` WHERE `quiz_responses`.`quiz_answer_id` = 755
QuizResponse Load (0.8ms) SELECT `quiz_responses`.* FROM `quiz_responses` WHERE `quiz_responses`.`quiz_answer_id` = 756
QuizResponse Load (1.5ms) SELECT `quiz_responses`.* FROM `quiz_responses` WHERE `quiz_responses`.`quiz_answer_id` = 757
QuizResponse Load (0.7ms) SELECT `quiz_responses`.* FROM `quiz_responses` WHERE `quiz_responses`.`quiz_answer_id` = 758
QuizResponse Load (0.6ms) SELECT `quiz_responses`.* FROM `quiz_responses` WHERE `quiz_responses`.`quiz_answer_id` = 759
QuizResponse Load (0.7ms) SELECT `quiz_responses`.* FROM `quiz_responses` WHERE `quiz_responses`.`quiz_answer_id` = 760
QuizResponse Load (0.6ms) SELECT `quiz_responses`.* FROM `quiz_responses` WHERE `quiz_responses`.`quiz_answer_id` = 761
QuizResponse Load (0.6ms) SELECT `quiz_responses`.* FROM `quiz_responses` WHERE `quiz_responses`.`quiz_answer_id` = 764
QuizResponse Load (0.8ms) SELECT `quiz_responses`.* FROM `quiz_responses` WHERE `quiz_responses`.`quiz_answer_id` = 765
此代码的预期目标是获取与资源 867 相关的所有问题,然后返回可能的答案以及与特定用户(在本例中为 18276)相关的响应
问题是,虽然只有与资源 867 相关的问题会作为 json 返回,但会返回所有用户的响应,而不管第一行中的 where 子句,而不仅仅是用户 18276 的响应。为什么是这样?有什么方法可以告诉 as_json 只使用它接收到的内容并返回初始查询中选择的 quiz_responses 吗?解决此问题的“rails 方式”是什么?
最佳答案
更新:新解决方案
Rails 不允许预加载参数化关联。但是可以通过两个查询加载所有必要的数据并将其解析为 json:
# load data
questions = QuizQuestion.preload(:quiz_answers)
answers_ids = questions.collect{ |question| question.quiz_answers.collect(&:id) }.flatten
responses = QuizResponse.where(quiz_answer_id: answers_ids).group_by(&:quiz_answer_id)
# making json
json_string = Jbuilder.encode do |json|
json.array! questions do |question|
json.merge! question.attributes
json.quiz_answers question.quiz_answers do |answer|
json.merge! answer.attributes
json.quiz_responses responses[answer.id] do |response|
json.merge! response.attributes
end
end
end
end
如果用户在问题中没有 quiz_response,此代码将不会从结果中省略 quiz_answer。
第一个版本:
数据结构有两个 quiz_responses 关联:
QuizQuestion 有_many :quiz_responses, through: :quiz_answers
QuizAnswer 有_many :quiz_responses
该查询包括 quiz_responses 作为 QuizQuestion 的关系。但是 as_json
使用 quiz_responses 作为 QuizAnswer 的关系。而且 Rails 不够智能,无法理解已经加载的必要 quiz_responses。
所有你需要做的就是以嵌套的方式重写包含,就像你想使用它一样:
questions = QuizQuestion.includes(quiz_answers: :quiz_responses)
关于mysql - as_json 忽略 .where() 子句的第二部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057106/
我正在尝试设置我的 git 配置,以便我可以使用工作环境和个人环境。 这是我的 ~.gitconfig 文件的内容(碰巧 work 和 private 在 github 上): [url "git@
我有以下情况。我在 Sheet1 上有一个项目列表,我想将项目复制到 Sheet2 并排除特定项目。 假设我在 Sheet1 上有以下项目列表: 我想将“梨”单元格留在 Sheet2 上。 它应该完全
我试图让 gcc 以不同的语言提供错误消息。但它仍然给我英文的错误信息。 我的语言环境输出 varun@varun-desktop:$ 语言环境 LANG=en_IN LC_CTYPE="es_EC.
我在 Linux x86 上使用 gcc。 我的程序将指向 C 函数的指针导出到 LLVM JIT 函数。调用约定是 cdecl。它在 Windows 上的 MingW 上运行良好。但是奇怪的事情发生
windows 上 php 的奇怪问题...我的应用程序加载了一个“核心”文件,该文件加载了一个设置文件、注册自动加载、进行初始化等。在核心文件的顶部我有 include_once("config.p
在工具|选项|调试器选项 |语言异常可以忽略特定的异常类型。是否可以为每个项目定义这个?例如在调试构建配置中(Delphi 2009 和/或 2010)? /编辑:Reported in QC 最佳答
我在一个文本框旁边有 2 个按钮,在这 2 个按钮后面还有另一个文本框。第一个文本框的 tabindex 为 1000,第一个按钮为 1001,第二个按钮为 1002。第二个文本框的 tabindex
我是 python 新手,正在尝试类型提示,但它们似乎只在某些情况下起作用。它们似乎在属性返回类型上按预期工作,但是当我尝试将整数分配给字符串值(即 self._my_string = 4)时,我没有
问题陈述 我有一些国家和这些国家的州的依赖组合框。我使用 VBA 在第一个组合框中填充唯一值,然后在第二个组合框中动态填充唯一值。该代码似乎忽略了初始传递中的条件。 例如,该代码适用于第一个国家/地区
我对 Javascript 有点陌生。我试图做到这一点,以便单击一个页面上的图像会将您带到一个新页面,并在该新页面上显示特定的 div,因此我使用 sessionStorage 来记住并使用 bool
我不确定我是否正确地处理了这个问题。 我有一个 ASP.NET MVC Web 应用程序。有 4 个主要“页面”通过单击菜单选项,可以选择一个页面,并将该页面选项存储在本地存储中。 现在,如果我刷新页
我的页面工作正常,并按预期显示日期和时间,直到我不得不添加 new Date() 以避免 momentjs deprecation warning 。现在我的约会比应有的时间晚了 5 个小时。 我该如
我需要合并一个 fork 项目。不幸的是,CVS $Id 行不同,因此我尝试的合并工具报告所有文件都不同(其中 95% 只有这一行不同) 是否有一个合并工具可以配置为忽略基于模式的行比较结果? [编辑
我是 python 新手,正在尝试类型提示,但它们似乎只在某些情况下起作用。它们似乎在属性返回类型上按预期工作,但是当我尝试将整数分配给字符串值(即 self._my_string = 4)时,我没有
我正在尝试根据 How do a send an HTTPS request through a proxy in Java? 使用代理访问 https 网页 但是我遇到了一个奇怪的问题:HttpsU
我有一个简单的 CMakeLists.txt 文件: cmake_minimum_required(VERSION 2.8.9) project (sample) add_library(Shared
这个问题在这里已经有了答案: typedef pointer const weirdness (6 个答案) 关闭 8 年前。 我有一个结构体 type_s。然后我将指向 struct type_s
我正在尝试制作一个使用 AES 256 加密的应用程序。不幸的是我无法让它工作。也许我没有完全理解密码逻辑。 所以它正在工作,但据我了解,哈希包含密码。但如果我更改密码,输出是相同的。因此,Crypt
我的文件包含一些行,例如 "This is a string." = "This is a string's content." " Another \" example \"" = " New ex
我尝试使用此查询来获取所选健身房的所有用户。 我的问题是查询忽略了这部分:ual.user_id = weekUsers.user_id 查询似乎获取了与我选择的日期匹配的所有用户 ID,而不检查该用
我是一名优秀的程序员,十分优秀!