Tag: arel

如何使用arel / relational algebra和has_many:through获取不同的值

当我试图显示一个人所在的所有电影,并且他们在电影中有超过1个角色(导演,作家,演员)时,我会为该电影获得多行。 如果我添加.select(’DISTINCT id’)或电影。*来尝试消除重复,我会收到以下错误: Mysql2 ::错误:您的SQL语法有错误; 查看与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在’DISTINCT id FROM movies INNER JOIN movie_people ON movies .id = movie_peop’ at line 1: SELECT movies .*, DISTINCT id FROM movies INNER JOIN movie_people ON movies .id = movie_people .movie_id WHERE (( movie_people`.person_id = 601619))ORDER BY title LIMIT 18 OFFSET 0 我不知道如何正确编码arel请求。 请帮忙。 谢谢。 应用程序/控制器 class PeopleController 18, :page […]

使用AREL编写“不在”sql查询中

我的范围定义如下: scope :ignore_unavailable, lambda { where([ “Item.id NOT IN (SELECT id FROM Cars WHERE Cars.status = ‘NA'” ]) } 目前它使用硬编码表名。 如何使用像Arel这样的框架来改进它? 将在这里感谢任何帮助。 我在Rails 3.2上

如何获得habtm协会的arel表?

我有两个具有HABTM关联的ActiveRecord模型。 我想编写一个scope来使用Arel获取孤立记录。 我的问题是我找不到一个方法来检索关联的arel_table 。 由于关系是HABTM,因此没有模型可以调用arel_table 。 我现在有以下(有效),但我创建了一个新的arel表,其中包含连接表的名称(使用reflect_on_association方法检索)。 scope :orphans, lambda { teachers = arel_table join_table = Arel::Table.new(reflect_on_association(:groups).options[:join_table]) join_table_condition = join_table.project(join_table[:teacher_id]) where(teachers[:id].not_in(join_table_condition)) } 这会产生以下SQL: SELECT `teachers`.* FROM `teachers` WHERE (`teachers`.`id` NOT IN (SELECT `groups_teachers`.`teacher_id` FROM `groups_teachers` )) 那么有没有更好的方法来检索arel_table而不是创建一个新的?

如何将此原始查询转换为Active记录查询接口或arel?

我想找到至少有一个variant_type = 1的variant并且没有variant_type = 2的任何variant的variant_type 。 所以我的查询如下: Course.where(“id IN ( SELECT course_id FROM course_variants WHERE variant_type = 1 ) AND id NOT IN ( SELECT course_id FROM course_variants WHERE variant_type = 2 )”) 此外, course有很多course_variants 。 我在where子句中使用原始查询,我想使用Active记录接口或Arel来改进它,任何解决方案都适用于此? 谢谢! 使用输入更新预期输出 输入 course: {id=1, course_variants: [{variant_type: 1}, {variant_type: 2}]} course: {id=2, course_variants: [{variant_type: 1}, {variant_type: 3}]} course: […]

模拟has_and_belongs_to_many嵌套在Rails 3中的行为

所以Rails不支持:通过关系进行关联。 有插件可以为Rails 2.x添加它,但我使用的是Rails 3 / Edge,只需要一个特定模型的关联。 所以我以为我会用Arel的美丽把自己弄得一团糟。 一,型号: class CardSet true end class Card true has_many :learnings, :dependent => :destroy end class Learning < ActiveRecord::Base belongs_to :card end 我希望获得属于特定卡片组的所有学习内容:through => cards。 这是我目前在CardSet模型中所拥有的: def learnings c = Table(Card.table_name) l = Table(Learning.table_name) j = Table(self.class.send(:join_table_name, Card.table_name, CardSet.table_name)) learning_sql = l.where(l[:card_id].eq(c[:id])).where(c[:id].eq(j[:card_id])).join(j).on(j[:card_set_id].eq(self.id)).to_sql Learning.find_by_sql(learning_sql) end 这给了我(该死的,Arel很漂亮!): SELECT `learnings`.`id`, `learnings`.`card_id`, `learnings`.`user_id`, […]

不具有区分大小写的搜索活动记录

我使用rails 3.0.4 这是我的rails应用程序中的一段Arel查询,如何使用upcase方法以数据库无关的方式进行无区分大小写的搜索? Customer.where(“company_id = ? and (firstname like ? or lastname like ? or reference like ?)”, current_user.company_id, “%#{params[:query]}%”, “%#{params[:query]}%”, “%#{params[:query]}%”) 谢谢

问题:activerecord(rails3),链接范围包含

在Rails3中,链接两个范围(ActiveRelations)时似乎存在问题,每个范围都有不同的include: 考虑这两个范围,这两个范围都可以自行运行: 第一范围: scope :global_only, lambda { |user| includes(:country) .where(“countries.area_id ?”, user.area) } Work.global_only(user)=>(从SQL中删除字段列表以便易读) SELECT * FROM “works” LEFT OUTER JOIN “countries” ON “countries”.”id” = “works”.”country_id” WHERE (countries.area_id 3) 现在是第二个范围: scope :not_belonging_to, lambda { |user| includes(:participants) .where(“participants.user_id ? or participants.user_id is null”, user) } Work.not_belonging_to(user)=>(从SQL中删除字段列表以便易读) SELECT * FROM “works” LEFT OUTER JOIN “participants” ON “participants”.”work_id” […]

通过OR或AND连接(粘合)条件(Arel,Rails3)

我有几个复杂的查询(使用子查询等…)并希望将它们与OR或AND语句粘合在一起。 例如: where1=table.where(…) where2=table.where(…) 我想要的东西 where3=where1.or where2 下一个示例对我不起作用: users.where(users[:name].eq(‘bob’).or(users[:age].lt(25))) 因为我有几个where(..)查询,我想连接它们 。 换一种说法 我有3个方法:首先返回第一个,第二个,第三个 – 或者连接。 我必须能够在我的应用程序中使用所有3种方法并保存DRY代码

如何通过SQL函数使属性设置器发送值

我试图让一个ActiveRecord模型中的属性设置器在rails生成其sql查询之前将其值包装在text2ltree()postgres函数中。 例如, post.path = “1.2.3” post.save 应该产生类似的东西 UPDATE posts SET PATH=text2ltree(‘1.2.3’) WHERE id = 123 # or whatever 这样做的最佳方法是什么?

Rails`where`的时间少于查询

建立 Rails’where方法可以在哈希中获取范围以生成将搜索范围内的值的查询。 例如: User.where(cash_money: 10..1000) #=> SELECT `users`.* FROM `users` WHERE (`users`.`cash_money` BETWEEN 10 AND 1000) 这也可以用于时间戳 User.where(last_deposit: 10.days.ago..1000.days.ago) #=> SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` BETWEEN ‘2014-05-19 14:42:36’ AND ‘2011-09-02 14:42:36’) 我发现你可以使用这样的哈希语法做一个小于或大于数字的简单 User.where(cash_money: 10..Float::INFINITY) #=> SELECT `users`.* FROM `users` WHERE (`users`.`cash_money` >= 10) 对于少于查询,使用-Float::INFINITY可以完成相同的操作。 题 有没有办法用时间戳来做到这一点,所以我可以得到如下的查询? SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= ‘2014-05-19 […]