【问题标题】:Rails gem rails3-jquery-autocomplete how to scope by userRails gem rails3-jquery-autocomplete 如何按用户进行范围
【发布时间】:2011-08-30 14:05:28
【问题描述】:

我正在使用 Rails gem rails3-jquery-autocomplete 为帖子添加类别。

我想将搜索限制为仅在结果中包含属于当前用户或帖子作者的类别。

文档说我可以指定范围:

:作用域

添加了使用范围的选项。在数组中传递范围。例如:范围 => [:scope1, :scope2]

但我不确定如何在这里传递用户 ID?

这似乎是一个常见的场景,我是否遗漏了一些明显的东西?

我找到了一个建议修改 get_item 方法的答案,但这似乎破坏了自动完成

Scoping the results for rails3 jquery autocomplete plugin

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 jquery-autocomplete named-scope


    【解决方案1】:

    posts_controller:

     def get_autocomplete_items(parameters)
        items = super(parameters)
        items = items.where(:user_id => current_user.id)
      end
    

    我是先调用原来的get_autocomplete_items方法,然后通过current_user.id过滤掉结果。

    这个问题有帮助: Rails 3: alias_method_chain still used?

    【讨论】:

    • 假设您使用了多个自动完成调用。覆盖它会弄乱您视图中的所有其他自动完成字段。沉重的教训。任何想法如何解决
    • @ctilley79 查看我对您问题的回答
    【解决方案2】:

    感谢上面的答案,我解决了类似的问题。

    我的自动完成功能也适用于用户模型,但我需要将结果限制在用户所在的机构(机构有很多 :users)。我的控制器创建了一个在视图中访问的 @institution 实例变量。

    虽然get_autocomplete_items方法不能直接访问实例变量,但我发现数据可以作为参数传递给autocomplete(注意:我使用simple_forms gem,所以输入调用看起来和标准rails语法有点不同) .

    在我看来:

    <%= f.input :email,  :url => autocomplete_user_email_institutions_path(:institution_id=>@institution.id.to_s), :as => :autocomplete %>
    

    在我的控制器中:

      autocomplete :user, :email, :extra_data => [:first_name, :last_name]
    
      def get_autocomplete_items(parameters)
        super(parameters).where(:institution_id => params[:institution_id])
      end
    

    我的自动完成列表现在仅限于为特定机构工作的用户。

    【讨论】:

      【解决方案3】:

      deb 的回答对我有用。 代码可以稍微清理一下:

      def get_autocomplete_items(parameters)
        super(parameters).where(:user_id => current_user.id)
      end
      

      【讨论】:

        【解决方案4】:


        对于超级方法有问题的人,代码有一个小的更新。由于动态调度,上面的代码需要替换如下:

        def get_autocomplete_items(参数) 项目 = 超级(参数) items = items.where(可搜索:true) 结尾

        到这里:

        def get_autocomplete_items(参数) 项目 = active_record_get_autocomplete_items(参数) items = items.where(可搜索:true) 结尾

        参考:https://github.com/crowdint/rails3-jquery-autocomplete/issues/278

        【讨论】:

          【解决方案5】:

          要回答@ctilley79 提出的问题,多个自动完成不是问题,因为除了可以在 params 哈希中传递更多值之外,您还可以访问自动完成参数。在我的表单上(例如),我同时拥有 City 和 Zip 自动完成功能。我需要将城市限制在某个州内。所以我的控制器动作如下所示:

          def get_autocomplete_items(parameters)
            if (parameters[:model] == City)
              super(parameters).where("state_id" => params[:state_id])
            else
              super(parameters)
            end
          end
          

          您还可以在需要时访问该方法。对参数执行 logger.debug 以查看所有可用的参数。

          【讨论】:

            【解决方案6】:

            我知道 gem 和问题是旧的,但我发现自己最近在使用这个 gem 并且需要这个答案......旧的答案将不再有效,因为在源代码中,方法 get_autocomplete_items 是动态生成的并且具有ORM 附加在方法名称上。这就是它为我工作的原因。我假设大多数人也在使用 ActiveRecord,但请检查 autocomplete.rb 方法“get_prefix”以确定您应该在方法名称前面加上什么以使其正常工作。

            希望这可以为某人节省大量时间。成为你想看到的改变以及所有这些;)

            def active_record_get_autocomplete_items(parameters)
              super(parameters).where(id: current_user.id)
            end
            

            【讨论】:

              【解决方案7】:

              我遇到了类似的问题。我们的站点是多租户的,因此所有内容都需要以租户为范围。

              为了使这更容易,我修改了 rails3-jquery-autocomplete 以接受另一个名为 :base_scope 的选项。它需要一个字符串,它会被评估而不是使用模型。所有其他功能都有效,因此您可以根据需要附加其他范围和 where 子句。

              我的叉子在这里:https://github.com/GiveCorps/rails3-jquery-autocomplete

              我不确定我编写的测试是否能证明它始终有效。我刚刚检查了它使用的是范围而不是 items 方法中的模型。

              我将不胜感激。不确定它是否值得拉取请求。

              【讨论】:

                猜你喜欢
                • 2016-02-04
                • 2013-06-25
                • 2011-04-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-12-17
                • 2013-04-10
                • 1970-01-01
                相关资源
                最近更新 更多