标签: activerecord-relation

Rails 4按模型方法求和

在我的应用程序中,我有一个User模型,有一个goal_ytd方法,执行一些计算.

在控制器,我有一个变量@users可能是UserActiveRecord::Relationusers,我想总结所有的@usersgoal_ytd秒.

我的第一个倾向是:

@users.sum(&:goal_ytd)
Run Code Online (Sandbox Code Playgroud)

在两种情况下都抛出了弃用警告,因为在Rails 4.1中使用sumon ActiveRecord::Relation会消失.

所以,我将代码更改为:

@users.to_a.sum(&:goal_ytd)
Run Code Online (Sandbox Code Playgroud)

然后扔了NoMethodError,因为在某些情况下,@users由分配@users = UserUser没有to_a方法.

@users使用@users = User.allthrows 分配弃用警告因为Relation#all也已弃用.

有没有办法把所有Users作为一个数组?有没有更好的办法?

ruby activerecord ruby-on-rails activerecord-relation ruby-on-rails-4.1

16
推荐指数
2
解决办法
1万
查看次数

在Model类方法中指定当前抓取的记录

我有一个类方法,我想修改当前由ActiveRecord::Relation对象抓取的记录.但我不知道如何在类方法中引用当前作用域. self不这样做.

例:

class User < ActiveRecord::Base
  ...

  def self.modify_those_records
    #thought implicitly #to_a would be called on currently grabbed records but doesn't work
    temp_users_to_a = to_a
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

我会像这样使用它:

User.some_scope.modify_those_records
Run Code Online (Sandbox Code Playgroud)

所以User.some_scope会回到我身边ActiveRecord::Relation,其中包含一堆User记录.然后,我想修改该类方法中的那些记录,然后返回它们.

问题是:我不知道如何在类方法中明确引用"那组记录".

ruby activerecord ruby-on-rails activerecord-relation

6
推荐指数
1
解决办法
90
查看次数

ActiveRecord::Relation.concat 在 Rails 5 中失败

愚蠢的问题,但我不确定为什么这会在 Rails 4.2 中起作用,但在 Rails 5.2 中不起作用。

FamilyCharacteristic.where(family_id: @user.family_ids)
                    .concat(@user.characteristics)
Run Code Online (Sandbox Code Playgroud)

规范在 5.2 中失败:

Failure/Error:
       FamilyCharacteristic.where(family_id: @user.family_ids)
                           .concat(@user.characteristics)

     NoMethodError:
       undefined method `concat' for #<ActiveRecord::Relation []>
       Did you mean?  count
Run Code Online (Sandbox Code Playgroud)

concat 是从ActiveRecord::Relation5.2 中删除的还是FamilyCharacteristic.where(family_id: @user.family_ids)在 < 4.2 中是不同的对象?

谢谢你的帮助。

ruby activerecord ruby-on-rails activerecord-relation

6
推荐指数
1
解决办法
1888
查看次数

Rails结合了多个activerecord关系

我想结合多个活动记录关系

例如,

apple_companies = Company.where("name like ?","%apple%")
banana_companies = Company.where("name like ?","%banana%")
Run Code Online (Sandbox Code Playgroud)

我想结合这两种关系.

不合并,合并是apple_companies.merge(banana_companies)=> Company.where("名称像?和名字一样?","%apple%","%banana%")

我想要Company.where("名字喜欢?或名字喜欢?","%apple%","%banana%")

之后,

我会编码

companies = Company.none
company_name_list.each do |name|
    like = "%"+name+"%"
    companies += Company.where("name like ?",like)
end
Run Code Online (Sandbox Code Playgroud)

但是我写的代码使公司成为阵列......

所以我不能订购和页面公司...... :(

谢谢

ruby ruby-on-rails-4 rails-activerecord activerecord-relation

5
推荐指数
3
解决办法
8084
查看次数

Rails:在定义关联之前不能有 has_many :through 关联

将应用程序从 Rails 4.2.9 升级到 Rails 5.2.1。

通过大部分讨厌的部分更新依赖项和诸如此类的东西,最终让应用程序consoleserver. 一些页面加载但其他页面:

不能有 has_many :through 关联 'User#clubs' 在定义直通关联之前通过 'User#memberships'。

不清楚 Rails 5 中可能发生了什么变化来触发这个?甚至不知道从哪里开始寻找。

想法?

似乎在线失败,如下所示:

class ViewableStories
  ...
  def for_user
    Story
      .includes(:publications)
      .references(:publications)
      .where(
        stories[:user_id]
        .eq(@user.id)
        .or(
          publications[:club_id]
          .in(@user.club_ids)        <<==== execution halts
          .and(
            publications[:publish_on]
            .lt(Date.today)
            .or(publications[:publish_on].eq(nil))
          )
        )
      )
  end
end
Run Code Online (Sandbox Code Playgroud)

这是从 model/story.rb

  def self.viewable_published_stories_for(user)
    ViewableStories
      .for_user(user)
      .includes(:cover_image, :user, :table_of_contents)
      .published
      .chronological
  end
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails has-many-through activerecord-relation

5
推荐指数
1
解决办法
1587
查看次数