我有一个对象数组,我们称之为Indicator.我想def self.subjects在这个数组上运行Indicator类方法(变种类,范围等).我知道在一组对象上运行类方法的唯一方法是让它们成为ActiveRecord :: Relation.所以我最终要求添加一个to_indicators方法Array.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
Run Code Online (Sandbox Code Playgroud)
有时我会链接相当多的这些范围来过滤类方法中的结果.所以,即使我在ActiveRecord :: Relation上调用一个方法,我也不知道如何访问该对象.我只能通过它来获取它的内容all.但是all是一个数组.那么我必须将该数组转换为ActiveRecord :: Relation.例如,这是其中一种方法的一部分:
all.to_indicators.applicable_for_bank(id).each do |indicator|
total += indicator.residual_risk_for(id)
indicator_count += 1 if indicator.completed_by?(id)
end
Run Code Online (Sandbox Code Playgroud)
我想这可以归结为两个问题.
where每次都做.def self.subjectsActiveRecord :: Relation上运行类型方法时,如何访问ActiveRecord :: Relation对象本身?谢谢.如果我需要澄清任何事情,请告诉我.
我正在使用SphinxSearch查询一些内容并拥有我想用MySQL查询的对象的id.我的ID数组根据Sphinx给出的等级排序.因此,我想像这样制作一个MySQL:
SELECT * FROM table WHERE id IN (1,17,2)
ORDER BY FIELD(id,1,17,2)
Run Code Online (Sandbox Code Playgroud)
我知道我能做到:
Table::whereIn('id', $ids)->get();
Run Code Online (Sandbox Code Playgroud)
但我无法得到我的订单.
我怎么能用Laravel以适当的方式做到这一点?
我有一组id,存储在一些外部存储(rails cache或redis)中.在控制器的操作中,我获取此数据并使用它选择对象,即
ids = [5, 1, 17, 84] # really fetched from external source
result = MyModel.where(:id => ids)
Run Code Online (Sandbox Code Playgroud)
我也希望它的顺序与array_of id中的id相同:
ids == result.map(&:id) # => true
Run Code Online (Sandbox Code Playgroud)
作为解决方法,我使用mysql FIELD函数排序:
MyModel.where(:id => ids).order("FIELD(id, #{ids.join ', '})")
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这种方法,因为它是特定于mysql的,并且在大ids数组的情况下创建非常长的查询.有没有更好的,与DB无关的方法呢?从数据库获取未分类的数据并在ruby端进行排序是不可取的,因为它资源昂贵并且难以与分页一起使用.
谢谢.
是否可以通过查询中提供的元素列表对django查询集进行排序?例如,如果我这样做
m.objects.filter(id__in=[3,1,8])
Run Code Online (Sandbox Code Playgroud)
我不希望查询集的顺序是id 3的元素,id 1的元素和id 8的元素.
谢谢
好的,有一些关于如何做到这一点的答案.但所有答案都假设查询选择了全部.如果您有明确的选择,则方法不再有效.
请参阅此处了解该方法:在Postgresql中模拟MySQL的ORDER BY FIELD()
基本上我有
SELECT DISTINCT id
FROM items
WHERE id IN (5,2,9)
ORDER BY
CASE id
WHEN 5 THEN 1
WHEN 2 THEN 2
WHEN 9 THEN 3
END
Run Code Online (Sandbox Code Playgroud)
当然,这打破并说
"PGError:错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中"
有没有办法按照IN子句中的值的顺序在PostgreSQL中排序查询结果?
我有一个由 (id, rank) 对组成的字典。我想对 id 执行 Django 查询,以便结果查询集按排名(降序)排序。
获取查询集很容易:
rankings = {...}
result = MyModel.objects.filter(id__in=rankings.keys())
Run Code Online (Sandbox Code Playgroud)
似乎答案应该涉及某种注释,我可以将其用作 order_by 的一部分,但我不知道如何到达那里。
编辑:我忽略了我需要结果是一个 QuerySet,因为这是一个美味 API 管道的一部分。
使用:用户搜索部分邮政编码,例如"RG20",然后按特定顺序显示.该查询在布尔模式下使用MATCH AGAINST方法,其中数据库中的邮政编码示例为"RG20 7TT",因此它能够找到它.同时,它还匹配其半径中的其他邮政编码列表(这是一个单独的查询).
我似乎无法通过部分匹配找到订购方式,例如:
ORDER BY FIELD(postcode, 'RG20', 'RG14', 'RG18','RG17','RG28','OX12','OX11')
DESC, city DESC
Run Code Online (Sandbox Code Playgroud)
因为它不是专门寻找RG20 7TT,我认为它不能进行部分匹配.
我已经尝试了SUBSTR(邮政编码,-4)并向左和向右看,但我没有使用'by field'取得任何成功,也找不到另一条路线......对不起,这有点长啰嗦,但我'我有点绑定.英国邮政编码分为两部分,最后一部分总是3个字符,在我的数据库中,两者之间有一个空格,如果这有帮助的话.
虽然在邮政编码之后有一个DESC,我确实需要它们以特定的顺序显示(RG20,RG14然后是RG18等).我不确定指定降序是否会删除顺序
我想在Django中使用ORDER BY FIELD()(MySQL).Django支持吗?
所以在MySQL中它看起来像:
SELECT * FROM fruit
ORDER BY FIELD(name, 'Banana', 'Apple', 'Pear', 'Orange'), variety;
Run Code Online (Sandbox Code Playgroud)
我想在django ORM中使用它.我怎样才能做到这一点.我可以这样做吗order_by()?或以extra()某种方式使用.
不这样工作:
Fruit.objects.all().extra(order_by="FIELD(name, 'Banana', 'Apple', 'Pear', 'Orange')")
我收到按"收入"排序的UserIds列表(一次大约1000个).我在"我的系统数据库"中有用户记录,但"收入"列不存在.我想从列表中收到的排序顺序中的"我的系统数据库"中检索用户.我尝试使用Active Record执行以下操作,期望以与排序列表中相同的顺序检索记录,但它不起作用.
//PSEUDO CODE
User.all(:conditions => {:id => [SORTED LIST]})
Run Code Online (Sandbox Code Playgroud)
我在下面的链接中找到了类似问题的答案,但我不确定如何使用Active Record实现建议的解决方案.
还有其他办法吗?
请指导.
Shardul.
postgresql activerecord ruby-on-rails sql-order-by in-clause
我有一个items用type列调用的表.此列可以具有以下值之一:
rock
paper
scissor
Run Code Online (Sandbox Code Playgroud)
在我的翻译文件中:
en:
rock: Stone
paper: Wood
scissor: Weapon
Run Code Online (Sandbox Code Playgroud)
如何使用ActiveRecord获取结果并按翻译后的值对其进行排序?
显然,如果我这样做,Item.where(something: true).order('name asc')我会得到数据库(rock)内的值而不是翻译的值(Stone)的结果.
我知道一些ruby方法,比如sort_by和sort订购带有ruby的项目,但我想在性能原因下在ActiveRecord中订购结果.
我将字符串变量存储在数据库中,"Abstain","Block","No"或"Yes".目前我正在使用一个ORDER BY position,而不是字母顺序,我想命令他们像:'阻止','不','弃权','是'.在Rails中有一个简单的方法吗?
我的确切代码是:
def self.unique_votes(motion)
Vote.find_by_sql("SELECT * FROM votes a WHERE created_at = (SELECT MAX(created_at) as created_at FROM votes b WHERE a.user_id = b.user_id AND motion_id = #{motion.id}) ORDER BY a.position")
end
Run Code Online (Sandbox Code Playgroud)
注意:我正在使用Postgres SQL,我正在寻找一个可以在select语句中使用的解决方案谢谢!
我有这个数组作为Laravel Collection:
"data": [
{
"id": 863368,
"reference": "Ref 1",
"status": 1
},
{
"id": 863391,
"reference": "Ref 2",
"status": 2
},
{
"id": 863390,
"reference": "Ref 3",
"status": 2
},
{
"id": 863396,
"reference": "Ref 4",
"status": 3
}
];
Run Code Online (Sandbox Code Playgroud)
我需要按status而不是按asc或对其进行排序desc,但是具有状态的记录2应首先在列表上,然后是状态,1然后是状态3。
我不知道如何实现这一目标,在此先感谢您。
postgresql ×5
activerecord ×4
django ×3
ruby ×3
laravel ×2
mysql ×2
php ×2
sql ×2
sql-order-by ×2
arrays ×1
in-clause ×1
laravel-5 ×1
localization ×1
postal-code ×1
python ×1
sorting ×1
sphinx ×1