我正在尝试从数据库中检索两个内容:第一个字段来源等于"imported"
(这意味着我们从excel电子表格中导入),第二个来自{{1 (我们从头开始创建)。附上我的代码:
source != imported
我希望在显示之前将两个结果结合起来:
def index
add_breadcrumb 'Projects', projects_path
add_breadcrumb @project.name, @project
add_breadcrumb "List #{@category.display_name} Content", project_category_contents_path(@project, @category)
@contents_imported = Content.of_project(@project).with_category(@category).imported.order('contents.created_at asc')
@contents_not_imported = Content.of_project(@project).with_category(@category).not_imported.order('contents.created_at desc')
@page = params[:page]
@contents = @contents_not_imported << @contents_imported
@q = @contents.search(params[:q])
@content = @q.result(distinct: true).page(@page).per(20)
end
@contents_imported = Content.of_project(@project).with_category(@category).imported.order('contents.created_at asc')
@contents_not_imported = Content.of_project(@project).with_category(@category).not_imported.order('contents.created_at desc')
但它不起作用。我怎么能这样做?
答案 0 :(得分:1)
如果它们都是数组且具有相同类型的对象,则可以执行Result = Arr1 | Arr1
这也删除了重复项。它就像布尔UNION。在您的情况下@contents = @contents_not_imported | @contents_imported
答案 1 :(得分:1)
问题是您想要连接结果,但您还希望继续将组合结果视为ActiveRelation(在其上调用.search
)。这是一种更简单的方法,它首先避免了连接的需要。但是,您需要一个更复杂的ORDER BY子句来完成此任务:
@page = params[:page]
@contents = Content.of_project(@project).with_category(@category).
order('CASE WHEN source <> "imported" THEN contents.created_at END desc, CASE WHEN source = "imported" THEN contents.created_at END asc')
@q = @contents.search(params[:q])
答案 2 :(得分:0)
使用加号
连接数组你得到undefined method search for Array
因为,连接会返回一个数组。而且您无法在Array
修改强>
def index
add_breadcrumb 'Projects', projects_path
add_breadcrumb @project.name, @project
add_breadcrumb "List #{@category.display_name} Content", project_category_contents_path(@project, @category)
contents_imported_ids = Content.of_project(@project).with_category(@category).imported.order('contents.created_at asc').map(&:id)
contents_not_imported_ids = Content.of_project(@project).with_category(@category).not_imported.order('contents.created_at desc').map(&:id)
@page = params[:page]
contents_ids = contents_imported_ids + contents_not_imported_ids
contents = Content.where(content_ids)
@contents = content_ids.collect{|id| contents.detect{|c| c.id == id}}
@q = @contents.search(params[:q])
@content = @q.result(distinct: true).page(@page).per(20)
end
答案 3 :(得分:0)
只需使用导入或未导入的条件创建新的关系,然后订购所有记录(如果订单对@contents
和@content
很重要):
def index
add_breadcrumb 'Projects', projects_path
add_breadcrumb @project.name, @project
add_breadcrumb "List #{@category.display_name} Content", project_category_contents_path(@project, @category)
@contents_imported = Content.of_project(@project).with_category(@category).imported.order('contents.created_at asc')
@contents_not_imported = Content.of_project(@project).with_category(@category).not_imported.order('contents.created_at desc')
@page = params[:page]
imported = @contents_imported.where_values.reduce(:and)
not_imported = @contents_not_imported.where_values.reduce(:and)
@contents = Content.where(imported.or(not_ipmorted)).order('CASE contents.imported WHEN true THEN contents.created_at asc ELSE contents.created_at desc END')
@q = @contents.search(params[:q])
@content = @q.result(distinct: true).page(@page).per(20)
end
现在您可以在Ransack#search
上调用@contents
,因为它是一个ActiveRecord :: Relation。我假设导入的范围采用值contents.imported
,其值为true。
如果我写的没有错误,这必须有效。