Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何按顺序创建一组问题和子问题?_Ruby On Rails - Fatal编程技术网

Ruby on rails 如何按顺序创建一组问题和子问题?

Ruby on rails 如何按顺序创建一组问题和子问题?,ruby-on-rails,Ruby On Rails,我有一个数据库的问题和子问题(属于1个问题)。我希望子问题在每个问题中有序排列 另外,我想在他们之间安排一些主要问题。一种方法是在问题和子问题表中添加订单列,并手动填写。但是,由于这个数据库可以是非常动态的,所以这不是一个可行的选择 所以,我想要的是 1. Root Q1 a. Sub1_Q1 b. Sub1_Q2 2. Root Q2 a. Sub2_Q1 b. Sub2_Q2 c. Sub2_Q3 我见过像祖先和作为树的宝石。虽然可以在那里创建父子关

我有一个数据库的问题和子问题(属于1个问题)。我希望子问题在每个问题中有序排列

另外,我想在他们之间安排一些主要问题。一种方法是在问题和子问题表中添加订单列,并手动填写。但是,由于这个数据库可以是非常动态的,所以这不是一个可行的选择

所以,我想要的是

1. Root Q1
    a. Sub1_Q1
    b. Sub1_Q2
2. Root Q2
    a. Sub2_Q1
    b. Sub2_Q2
    c. Sub2_Q3

我见过像
祖先
作为树
的宝石。虽然可以在那里创建父子关系,但没有范围来排序一组兄弟姐妹。

假设您有一个包含许多子问题的问题模型(子问题模型)。您需要按照DESC的created_排序问题,按照ASC的created_排序子问题(在每个问题中)

因此,模型将如下所示:

class Question < ActiveRecord::Base
  has_many :subquestions, -> { order("created_at ASC") }
end
class SubQuestion < ActiveRecord::Base
  belongs_to :question
end
这将导致下一个查询:

SELECT "questions".* FROM "questions"  ORDER BY created_at DESC
SELECT "subquestions".* FROM "subquestions" WHERE "subquestions"."question_id" IN (...)  ORDER BY created_at ASC

这样,当你在问题的每个子问题中迭代每个问题时,你将拥有正确的顺序-问题和子问题

假设您有一个包含许多子问题的问题模型(子问题模型)。您需要按照DESC的created_排序问题,按照ASC的created_排序子问题(在每个问题中)

因此,模型将如下所示:

class Question < ActiveRecord::Base
  has_many :subquestions, -> { order("created_at ASC") }
end
class SubQuestion < ActiveRecord::Base
  belongs_to :question
end
这将导致下一个查询:

SELECT "questions".* FROM "questions"  ORDER BY created_at DESC
SELECT "subquestions".* FROM "subquestions" WHERE "subquestions"."question_id" IN (...)  ORDER BY created_at ASC

这样,当你在问题的每个子问题中迭代每个问题时,你将拥有正确的顺序-问题和子问题

虽然像intale的解决方案那样直接使用DB查询进行排序更好,但您提到了动态DB(Mongoid?),可能您就是做不到

您仍然可以“手动”对显示的项目进行排序(假设
score(q)
是一个计算问题/子问题分数的函数)

问题_controller.rb

def索引
#急于加载以避免其他查询
#如果使用kaminari,则可以用任何其他内容替换.all(如by.page(params[:page]))
@问题=问题。包括(:子问题)。all.to_a.sort{| q1,q2 | score(q1)score(q2)}
结束
视图/问题/index.html.erb



它比DB ORDER\u BY慢得多,而且绝对不适合大量数据,但是您可以使用任何代码作为
评分
函数

虽然最好直接使用DB查询进行排序,就像在intale的解决方案中一样,您提到了动态DB(Mongoid?),但可能您就是做不到这一点

您仍然可以“手动”对显示的项目进行排序(假设
score(q)
是一个计算问题/子问题分数的函数)

问题_controller.rb

def索引
#急于加载以避免其他查询
#如果使用kaminari,则可以用任何其他内容替换.all(如by.page(params[:page]))
@问题=问题。包括(:子问题)。all.to_a.sort{| q1,q2 | score(q1)score(q2)}
结束
视图/问题/index.html.erb



它比DB ORDER_BY慢得多,并且绝对不适用于大量数据,但是您可以使用任何代码作为
评分
函数

是否有任何理由不将这两个表模型关联起来?这个问题将有许多子问题,子问题将属于一个问题?是的,我会把它们联系起来。但是,我该如何创建订单呢?您可以在子问题的模型文件中执行smth,比如
default\u scope->{order(created\u at::desc)}
。这将按降序排列您的子问题。这就是所谓的带有Thorky lambda的范围。您可以随意订购。ActiveRecord或Mongoid?您有没有理由不将这两个表模型关联起来?这个问题将有许多子问题,子问题将属于一个问题?是的,我会把它们联系起来。但是,我该如何创建订单呢?您可以在子问题的模型文件中执行smth,比如
default\u scope->{order(created\u at::desc)}
。这将按降序排列您的子问题。这就是所谓的带有Thorky lambda的范围。您可以随意订购。ActiveRecord还是Mongoid?
<% questions.each do |q| %>
  <!-- Question Stuff -->
  <% q.subquestions.sort{ |q1, q2| score(q1) <=> q2} %>
    <!-- Subquestion stuff -->
  <% end %>
<% end %>