问题标签 [named-scope]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3125 浏览

ruby-on-rails - 混合acts_as_tree(祖先gem)、acts_as_list 和默认模型范围

我正在使用祖先 gem在树中构建一些组。同时,我使用acts_as_list 将组保持在排序列表中的同一树级别。给定以下模型:

这非常符合预期,例如,我用来@group.path在管理界面顶部生成面包屑导航。生成的 SQL 没问题,面包屑按树的深度排序。至少对于开发环境来说是这样。

在生产中,它看起来完全不同:跟踪生成的 SQL 我发现不是祖先的path生成结果顺序,而是我default_scope的接管。

所以我修复了我的模型,通过覆盖忽略默认范围path

但是,虽然这从我default_scope的开发中删除了位置范围,但在生产中仍然完全被忽略了。跟踪生产中的 SQL,我没有看到祖先的深度排序,而是从我的default_scope.

更新:由于我最初对“修补”该path方法的想法有点愚蠢(敲敲:它不是继承的,它是动态定义的),我尝试了以下方法仍然无济于事:

在开发中调用path生成的SQL如下:

与之相比,这里是生产中生成的 SQL:

开发使用 SQLite,而生产使用 MySQL——但我认为这不是关键的区别。

0 投票
6 回答
83767 浏览

ruby-on-rails - 您如何在 Rails 3 中确定 ActiveRecord 关联的范围?

我有一个 Rails 3 项目。Rails 3 带来了 Arel 和重用一个范围来构建另一个范围的能力。我想知道在定义关系(例如“has_many”)时是否有使用范围的方法。

我有具有权限列的记录。我想构建一个将我的权限列考虑在内的 default_scope,以便过滤记录(即使是通过关系访问的记录)。

目前,在 Rails 3 中,default_scope(包括我找到的补丁)不提供传递 proc 的可行方法(我需要后期变量绑定)。是否可以定义一个可以传递命名范围的 has_many ?

重用命名范围的想法如下:

或者隐式编码关系中的命名范围如下所示:

我只是想将 default_scope 与后期绑定一起应用。我更喜欢使用 Arel 方法(如果有的话),但会使用任何可行的选项。

由于我指的是当前用户,因此我不能依赖在最后一刻未评估的条件,例如:

0 投票
1 回答
672 浏览

sql - 带有命名范围的 has_many_through 关联中 :uniq => true/Distinct 选项的问题(Rails)

请参阅问题底部的更新。

我不得不对我的应用程序进行一些调整以添加新功能,而我的更改似乎破坏了以前完美运行的 :uniq 选项。

这是设置:
#User.rb
has_many :products, :through => :seasons, :uniq => true
has_many :varieties, :through => :seasons, :uniq => true
has_many :seasons

#product.rb
has_many :seasons
has_many :users, :through => :seasons, :uniq => true
has_many :varieties

#season.rb
belongs_to :product
belongs_to :variety
belongs_to :user
named_scope :by_product_name, :joins => :product, :order => 'products.name'

#variety.rb
belongs_to :product
has_many :seasons
has_many :users, :through => :seasons, :uniq => true

首先,我想向您展示当前正在破坏的视图的先前版本,以便我们有一个基线进行比较。下面的视图是拉起属于用户的产品和品种。在以下两个版本中,我为用户分配了相同的产品/品种,因此日志将查看完全相同的用例。

#user/show

这行得通。它只显示一种产品,然后显示每种产品的品种。在下面的日志中,产品 ID 1 有 3 个关联品种。产品 ID 43 没有。

这是上面代码的日志输出:

好的,所以上面的所有内容都是以前的版本,效果很好。在新版本中,我在名为 的连接表中添加了一些列seasons,并制作了一堆自定义方法来查询这些列。因此,我对您在上面看到的视图代码进行了以下更改,以便我可以访问seasons模型上的这些方法:

这是日志输出:

我有两个问题:
(1) :uniq 选项不适用于products. 同一产品的三个不同版本显示在页面上。
(2) :uniq 选项不适用于varieties. 我还没有对此设置验证,如果用户两次输入相同的品种,它确实会出现在页面上。在以前的工作版本中,情况并非如此。

我需要的结果是任何给定 ID 仅显示一个产品,并且与该 ID 关联的所有品种与此类唯一产品一起显示。

让我印象深刻的一件事是最近的日志输出中的 sql 调用。它将“计数”添加到不同的调用中。我不确定它为什么这样做,或者它是否可能表明存在问题。我发现这张未解决的灯塔票似乎可能相关,但我不确定它是否是同一个问题:https ://rails.lighthouseapp.com/projects/8994/tickets/2189-count-breaks-sqlite -has_many-through-association-collection-with-named-scope

更新

我认为问题在于named_scope 每个季节都被调用一次。named_scope 中需要有一些东西可以按季节 ID 缩小返回的产品范围。

现在发生的事情是:

user = get me user
seasons = get me user's seasons (say, there are 3 seasons for user)
products = get me the products
products += get me the products
products += get me the products

给我每一个产品

所以发生的事情不是 uniq 正在破坏,而是命名范围上没有分隔符。(我认为)。

我尝试了以下方法,但它抛出了这个异常:odd number list for Hash

想法?

更新#2

好的,现在我在想也许它根本不是命名范围。

#user/show中,我只是更改了循环以绕过命名范围:

上面没有使用命名范围,但我仍然得到相同的结果。换句话说,我仍然看到每个产品的所有实例,而不仅仅是一个。

上面创建第一个循环的代码与我在此问题顶部列出的原始代码相同。不同之处在于,这段代码循环通过seasons命中products,而我的原始代码循环通过products. 这种差异是问题所在,但我不知道如何解决它。

另外,我在最初的问题中提到我也无法让品种循环工作。您可以直接在上面的代码中看到注释的行。当循环遍历季节而不是产品时,当 Rails 遇到该品种循环时,它会引发名称错误:

似乎这可能是同一问题的另一个症状?

还有其他想法吗?

0 投票
5 回答
5151 浏览

ruby-on-rails - 重用 named_scope 来定义另一个 named_scope

我所看到的问题本质

有一天,如果我没记错的话,我看到了一个重用named_scope 来定义另一个named_scope 的例子。像这样的东西(不记得确切的语法,但这正是我的问题):

问题是:如果可能的话,确切的语法是什么?我找不到它,谷歌也没有帮助。

一些解释

为什么我真正想要它,是因为我使用 Searchlogic 来定义一个复杂的搜索,这可能会导致这样的表达式:

但它太长了,不能放在任何地方。因为,据我所知,Searchlogic 只是动态定义了 named_scopes,所以我想在 Card 类上设置一个 named_scope,如下所示:

- 这是我将在我的 named_scope 中使用那个长 Searchlogic 方法的地方。但是,再一次,语法是什么?想不通。

恢复

那么,named_scope 嵌套(我的意思不是链接)实际上可能吗?

0 投票
1 回答
99 浏览

mysql - named_scope 的 PGError 语法问题

我有以下 named_scope,它在 MySQL 和 sqlite 中运行良好,但在 Postgres 中运行良好:

然后我打电话:

我得到错误:

PGError:错误:在“结束”第 1 行或附近出现语法错误:... WHERE (start < '2010-03-17 14:03:24.995746' AND end > '201... ^ : SELECT count(*) AS count_all 来自“课程”WHERE(开始 < '2010-03-17 14:03:24.995746' AND end > '2010-03-17 14:03:24.995748' )

我的 google-fu 让我失望了,所以我希望 Stack Overflow 不会。关于如何使该范围对 Postgres 友好的任何想法?谢谢,

德鲁

0 投票
1 回答
84 浏览

sql - 如何将此 MySQL 语句转换为 named_scope 方法?

“从用户中选择*,奖励其中(users.id = Awards.user_id)和awards.trophy_id不在(从awards.trophy_id = #{trophy.id}的奖励中选择awards.trophy_id)”

0 投票
1 回答
731 浏览

ruby-on-rails - 如何:搜索逻辑和标签

我已经安装了 searchlogic 并添加了 will_paginate 等。

我目前有一个使用acts_as_taggable_on 插件启用标记的产品模型。我想使用 searchlogic 搜索标签。

这是可标记插件页面:http: //github.com/mbleigh/acts-as-taggable-on

每个产品都有一个“tag_list”,我可以使用 Product.tag_list 访问它

或者我可以使用 Product.tags[0] 访问特定标签

我找不到用于搜索的范围,但是使用搜索逻辑。这是我工作表格的一部分。

我已经尝试过 :name_or_description_or_tagged_with_like 和 :name_or_description_or_tags_like 以及 :name_or_description_or_tags_list_like 来尝试让它工作,但我一直有一个错误,提示找不到我尝试过的选项(找不到命名范围)。我想知道如何让这个工作或如何创建我自己的named_scope,这将允许我搜索由可标记插件添加到每个产品的标签。

谢谢!

0 投票
1 回答
505 浏览

ruby-on-rails - 将 named_scope 用作匿名范围的一部分时发出警告

我有以下命名范围:

它在脚本/控制台中像这样工作得很好

但是如果我像这样使用它,作为匿名范围的一部分

我在第二行收到警告:

它仍然有效,但是导致警告的原因是什么?我该如何摆脱它?

0 投票
3 回答
615 浏览

sql - 为什么这个 Rails 命名范围返回空(未初始化?)对象?

在 Rails 应用程序中,我有一个模型 ,Machine它包含以下命名范围:

此命名范围在开发模式下工作正常。然而,在生产模式下,它按预期返回了 2 个模型,但模型为空或未初始化;也就是说,返回的是实际对象(不是nil),但所有字段都是nil. 例如,在控制台中检查命名范围的返回值时,将返回以下内容:

但是,如您所见,返回的对象的所有字段都设置为nil.

生产环境和开发环境基本相同。两者都使用 SQLite 数据库。这是为查询生成的 SQL 语句:

任何想法出了什么问题?

0 投票
3 回答
3581 浏览

ruby-on-rails - ruby on rails 命名范围实现

来自《使用 Rails 进行敏捷 Web 开发》一书

该声明

将导致仅对数据库进行一次查询。

Rails 如何实现这一点?我是 Ruby 的新手,我想知道是否有一个特殊的结构允许这种情况发生。

为了能够像这样链接方法,由 named_scope 生成的函数必须返回它们自己或一个对象,而不是可以进一步限定范围。但是 Ruby 怎么知道这是最后一个函数调用并且它现在应该查询数据库呢?

我问这个是因为上面的语句实际上是查询数据库,而不仅仅是返回由链接产生的 SQL 语句。