Tag: arel

将ActiveRecord habtm查询转换为Arel

我有一个非常普遍的关系: Photo has_and_belongs_to_many :tags Tag has_and_belongs_to_many :photos 在我的Photo模型中,我有一个“带标签”的方法,我用它来查找用一组给定的tag_ids标记的照片。 此查询只需匹配包含所有给定标记的照片,但无需考虑是否存在任何其他标记。 这是我的方法: def self.with_terms( array ) select(‘distinct photos.*’).joins(:tags).where(‘tags.id’ => array).group(“photos.” + self.column_names.join(‘, photos.’)).having(“count(*) = #{array.size}”) end 这按预期工作。 现在,为了更好地与我正在使用的其他库集成,我需要在Arel中重写它。 (让它成为Arel节点?,不确定你通常称之为什么)。 我一直在尝试这个,但说实话我以前从未尝试过使用过Arel,所以我有点失落。 我一直在试验控制台并尝试: t = Photo.arel_table q = t.join(:tags).on(t[:tags_id].in(array)) Photo.where(q) 但是,(1)我认为q首先不是正确的查询,并且(2)它创建了一个Arel::SelectManager ,当它传递到where调用引发时Cannot visit Arel::SelectManager 。 所以,显然我做错了。 更新:为了在这里特别具体,我希望返回一个Arel节点,因为我正在使用一个gem(ransack),希望你传递它的搜索方法的Arel节点。 Ransack将此Arel节点与其他节点链接在一起生成复杂的搜索查询。 Arel大师可以告诉我这是怎么做的吗?

具有别名表名的ActiveRecord查询

使用包含范围的模型关注点,知道嵌套和/或自引用查询的最佳方法是什么? 在我的一个问题中,我的范围与以下类似: scope :current, ->(as_at = Time.now) { current_and_expired(as_at).current_and_future(as_at) } scope :current_and_future, ->(as_at = Time.now) { where(“#{upper_bound_column} IS NULL OR #{upper_bound_column} >= ?”, as_at) } scope :current_and_expired, ->(as_at = Time.now) { where(“#{lower_bound_column} IS NULL OR #{lower_bound_column} <= ?", as_at) } def self.lower_bound_column lower_bound_field end def self.upper_bound_column upper_bound_field end 并通过has_many来引用,例如: has_many :company_users, -> { current } […]

Arel中的嵌套查询

我试图在Arel和/或Rails 3中的Active Record中嵌套SELECT查询以生成以下SQL语句。 SELECT sorted.* FROM (SELECT * FROM points ORDER BY points.timestamp DESC) AS sorted GROUP BY sorted.client_id 可以通过执行创建子查询的别名 points = Table(:points) sorted = points.order(‘timestamp DESC’).alias 但后来我被困在如何将它传递给父查询(没有调用#to_sql ,听起来很难看)。 如何使用SELECT语句作为Arel(或Active Record)中的子查询来完成上述操作? 也许有一种完全不同的方式来完成这个不使用嵌套查询的查询?

如何在Rails 3中实现批量插入

我需要将一组电子邮件作为不同的记录插入到我的联系人表中。 如何才能做到这一点。 Eg: @email = [“a@b.com”, “c@d.com”, “e@f.com”, … ] 我不想用。 @email.each do |email| @contact = Contact.new @contact.email = email @contact.save end 这导致n插入quires。 我只需要一个插入查询来插入这些值。 如何在rails 3.0.9(以及理想的MySQL)中完成。 请帮忙

检索具有空数组的记录时出现问题

我有一个大约100个用户的表,我也有一个用户ID数组。 我想要做的是显示所有不属于此用户ID数组的用户。 当我做这样的事情 User.where(‘id NOT IN (?)’, [9, 2, 3, 4]) 它成功返回用户id不属于该数组的记录。 但是,如果该数组是空的,那么 User.where(‘id NOT IN (?)’, []) 它不会返回任何用户,SQL查询看起来像这样 SELECT “users”.* FROM “users” WHERE (id NOT IN (NULL)) 有谁知道为什么会发生这种情况或者这可能是一个错误? 我正在使用Rails 3.2.5和PostgreSQL。

如何根据多对多相关模型的属性查找记录?

楷模… InternalUser has_many :internal_user_roles has_many :roles, :through => :internal_user_roles InternalUserRole belongs_to :internal_user belongs_to :role Role has_many :internal_user_roles has_many :internal_users, :through => :internal_user_roles 使用新的ActiveRecord查询API,我如何找到具有“ADMIN”角色的所有InternalUser ? 换句话说,我该如何生成此查询… SELECT * FROM internal_users i, internal_user_roles ir, roles r WHERE i.id = ir.internal_user_id AND r.id = ir.internal_user_id AND r.name = ‘ADMIN’

有没有办法使用AREL进行自定义关联?

model Post # ActiveRecord associations have tons of options that let # you do just about anything like: has_many :comments has_many :spam_comments, :conditions => [‘spammy = ?’, true] # In Rails 3, named scopes are ultra-elegant, and let you do things like: scope :with_comments, joins(:comments) end 有没有办法使用AREL或其他更精简的语法来定义自定义关联,就像命名范围一样优雅? 更新 我认为将这种细节放入一个关联中并不是一个好主意,因为关联应该总是/大多数定义模型之间的基本关系。

Rails 3.2(ActiveRecord)关联顺序与急切的加载和排序

我在rails中遇到了这种行为,我在文档中似乎找不到。 看起来,如果您将ActiveRecord查询复杂化到将基础SQL集成到“复杂”查询中(参见下文),则它不会遵循关联上指定的排序。 这是我的示例模型: class Article :name attr_accessible :title, :user_id, :user end 如果我执行“简单”查询,我可以获取按名称排序的相关类别: > Article.includes(:categories).first.categories.map &:name Article Load (0.1ms) SELECT “articles”.* FROM “articles” LIMIT 1 Category Load (0.2ms) SELECT “categories”.* FROM “categories” WHERE “categories”.”article_id” IN (11) ORDER BY name => [“category 3059”, “category 3212”, “category 3240”, “category 3651”, “category 4371”, “category 5243”, “category 6176”, “category 6235”, […]

Arel在聚合上导致无限循环

我在使用Arel在同一查询中聚合2列时遇到问题。 当我运行它时,整个服务器冻结了一分钟,在rails dev-server崩溃之前。 我怀疑是无限循环:)。 也许我误解了Arel的整个概念,如果有人能看一下,我将不胜感激。 此查询的预期结果如下所示:[{:user_id => 1,:sum_account_charges => 300,:sum_paid_debts => 1000},…] a_account_charges = Table(:account_charges) a_paid_debts = Table(:paid_debts) a_participants = Table(:expense_accounts_users) account_charge_sum = a_account_charges .where(a_account_charges[:expense_account_id].eq(id)) .group(a_account_charges[:user_id]) .project(a_account_charges[:user_id], a_account_charges[:cost].sum) paid_debts_sum = a_paid_debts .where(a_paid_debts[:expense_account_id].eq(id)) .group(a_paid_debts[:from_user_id]) .project(a_paid_debts[:from_user_id], a_paid_debts[:cost].sum) charges = a_participants .where(a_participants[:expense_account_id].eq(id)) .join(account_charge_sum) .on(a_participants[:user_id].eq(account_charge_sum[:user_id])) .join(paid_debts_sum) .on(a_participants[:user_id].eq(paid_debts_sum[:from_user_id]))

如何在Rails 3中加入表并计算记录?

我有一个有很多硬币的Collection类。 我正在尝试选择有两个以上硬币的collections品。 目前,我通过直接的Ruby实现这一点没有问题,但这是非常低效的。 我目前的代码: collections = Collection.all.select { |c| c.coins.count > 2 } 如何通过与Arel的joins调用实现这一目标? 谢谢!