gpt4 book ai didi

ruby-on-rails - Rails 添加两个具有事件记录结果的范围

转载 作者:数据小太阳 更新时间:2023-10-29 07:33:40 25 4
gpt4 key购买 nike

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

我使用单个字段通过 tag_name 和 user_name 进行搜索

用户.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”,它不起作用。

用户 Controller

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

控制台。

User.search("best") => Should search by both tag_name and user_name and return ActiveRecord result.

我想获得 User.search("best") 与标签名称 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

关于ruby-on-rails - Rails 添加两个具有事件记录结果的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33259409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com