如何在Ruby on Rails中合并两个对象

时间:2015-03-17 12:23:23

标签: ruby-on-rails ruby

我正在尝试从数据库中检索两个内容:第一个字段来源等于"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')

但它不起作用。我怎么能这样做?

4 个答案:

答案 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。

如果我写的没有错误,这必须有效。