在我的应用程序中,我有一个User模型,有一个goal_ytd方法,执行一些计算.
在控制器,我有一个变量@users可能是User或ActiveRecord::Relation的users,我想总结所有的@users的goal_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 = User并User没有to_a方法.
@users使用@users = User.allthrows 分配弃用警告因为Relation#all也已弃用.
有没有办法把所有Users作为一个数组?有没有更好的办法?
ruby activerecord ruby-on-rails activerecord-relation ruby-on-rails-4.1
我有一个类方法,我想修改当前由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记录.然后,我想修改该类方法中的那些记录,然后返回它们.
问题是:我不知道如何在类方法中明确引用"那组记录".
愚蠢的问题,但我不确定为什么这会在 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 中是不同的对象?
谢谢你的帮助。
我想结合多个活动记录关系
例如,
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
将应用程序从 Rails 4.2.9 升级到 Rails 5.2.1。
通过大部分讨厌的部分更新依赖项和诸如此类的东西,最终让应用程序console在server. 一些页面加载但其他页面:
不能有 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