簡體   English   中英

Rails添加兩個具有活動記錄結果的范圍

[英]Rails add two scope with active record result

我正在使用act-as-taggable-on gem

我使用單個字段按tag_name和user_name進行搜索

User.rb

class User < ActiveRecord::Base

  acts_as_taggable
  attr_accessor: :user_name, :age, :country, tag_list
  scope :tagged_with, lambda { |tag|
    {
      :joins => "INNER JOIN taggings ON taggings.taggable_id = user.id\
               INNER JOIN tags ON tags.id = taggings.tag_id AND taggings.taggable_type = 'User'",
      :conditions => ["tags.name = ?", tag],
      :order => 'id ASC'
    }
  }
  def self.search(search)
    if search
      where('name LIKE ?', "%#{search}%") + tagged_with(search)
    else
      scoped
    end
  end
end

但我得到分頁問題,​​而得到這個數組,我在config / initializer / will_paginate.rb中使用“will_paginate / Array”它不起作用。

用戶控制器

class UserController < ActionController::Base
  def index
    @users = User.search(params[:search]).paginate(:per_page => per_page, :page => params[:page])
  end

安慰。

User.search(“best”)=>應該同時搜索tag_name和user_name並返回ActiveRecord結果。

我想得到User.search(“best”)union的結果與標簽名稱User.tagged_with(“best”)的結果

你能幫我把這個范圍作為ActiveRecord關系添加到使用分頁而沒有問題。

我認為你只需要返回一個可鏈接的范圍(使用.而不是+ ):

where('name LIKE ?', "%#{search}%").tagged_with(search)

它返回一個ActiveRecord::Relation而不是一個Array

如果您需要執行UNION操作,我建議您遵循以下線程: ActiveRecord Query Union

一種可能的方法是擴展ActiveRecord:

module ActiveRecord::UnionScope
  def self.included(base)
    base.send(:extend, ClassMethods)
  end

  module ClassMethods
    def union_scope(*scopes)
      id_column = "#{table_name}.id"
      sub_query = scopes.map { |s| s.select(id_column).to_sql }.join(" UNION ")
      where("#{id_column} IN (#{sub_query})")
    end
  end
end 

用法(未測試):

class User < ActiveRecord::Base
  include ActiveRecord::UnionScope

  def self.search(search)
    if search
      union_scope(where('name LIKE ?', "%#{search}%"), tagged_with(search))
    else
      scoped
    end
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM