- 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/
我有一个模型,其中的数据在呈现为 json 时不应包含在内。所以我实现了类的 as_json 方法以使其行为适当。问题是当与此模型关联的其他模型呈现 json 时,我的自定义 as_json 没有被调
在 'as_json'/'to_json' 中传递方法来创建对象的 json 响应时,我们不能在方法中传递参数。 'as_json/to_json' 不支持它背后的原因是什么 例如, @posts.t
我正在尝试从包含 5 个表的现有数据库生成一个 json 结构::用户:资源:quiz_questions:测验答案:quiz_responses 一个资源有很多 quiz_questions,它有很
首先,我没有使用 Rails。我在这个项目中使用 Sinatra 和 Active Record。 我希望能够在我的模型类上覆盖 to_json 或 as_json 并让它定义一些“默认”选项。例如我
class User has_many :posts end 我想用 as_json 渲染一个 json 哈希值方法。 我将如何通过他们的 updated_at 对下面代码中的帖子进行排序属性而不
我在通过动态属性限制 as_json 包含时遇到问题: @pirates_ships = @current_account.pirates.as_json(:include => {:ships =>
在我的应用程序中,:foos 有许多 :bars,我将每个 foo 序列化为 JSON,如下所示: @foo.as_json( except: [:created_at, :updated_at]
我试图在我的一个模型中覆盖 as_json,部分是为了包含来自另一个模型的数据,部分是为了去除一些不必要的字段。从我读到的,这是 Rails 3 中的首选方法。为了简单起见,假设我有类似的东西: cl
我正在尝试将 ruby 哈希呈现为 haml 中的 json 字符串。 (! 告诉 haml 不要转义输出) ! { :name => "Paul" }.as_json 我期待这个输出 { "na
我正在尝试返回 ActiveRecord 的 JSON 表示形式,但不是让 JSON 字符串包含模型的键列名称,而是希望它在每列中显示不同的内容。有没有办法做到这一点?这是我的示例行 record.a
我正在尝试让 iOS 应用程序读取 Rails 服务器生成的 json。现在,我只是让它成为一个文本文件,但最终目标是通过路由检索它。 iOS 应用程序在尝试读取时抛出错误(使用 as_json 生成
我将 Sinatra (1.3.2) 与 Mongoid (2.4.10) 结合使用。我注意到将大约 350 个 mongo 文档转换为 JSON 需要很长时间。 我添加了一些基准包装器只是为了看看什
在我的模型中,我有一个 as_json 方法,如下所示: def as_json(options = {}) super(options.merge(include: [:user, co
Jbuilder 是使用 as_json 还是 to_json 来渲染? 我正在尝试使用类似于以下的别名覆盖 as_json 和 to_json: module BSON class Ob
Controller : user = User.find(params[:id]) respond_with({:posts => @posts.as_json}) 型号: def as_json(
我有一个名为 User 的模型,我正在使用 User.all.as_json 获取所有用户。 User 模型也有 first_name 和 last_name 的值,所以我的结果看起来像这样: [
我遇到了一个问题,我正在使用 as_json 方法,以及如何有效地返回 JSON 中的对象 AND 它也是 belongs_to 对象作为 JSON,其中 belongs_to 对象具有它自己的 be
我有 user 和 address。一个用户有一个地址。所以我使用应用以下关联。 class User < ApplicationRecord has_one :address, dependen
render :json => { "playlist" => playlist_description, "songs" => @playlist.songs.as_json(:in
我想在 AR 模型上调用 to_json 时修改类名。 IE。 Book.first.to_json #=> "{\"book\":{\"created_at\":\"2010-03-23 Book
我是一名优秀的程序员,十分优秀!