使用Rails 3.2,这段代码出了什么问题?
@reviews = @user.reviews.includes(:user, :reviewable)
.where('reviewable_type = ? AND reviewable.shop_type = ?', 'Shop', 'cafe')
Run Code Online (Sandbox Code Playgroud)
它引发了这个错误:
无法急切加载多态关联:可审核
如果我删除reviewable.shop_type = ?条件,它的工作原理.
如何基于reviewable_type和reviewable.shop_type(实际上shop.shop_type)进行过滤?
我读了这篇有趣的文章,关于使用多态来在Rails中创建更好的活动源.
我们最终得到类似的东西
class Activity < ActiveRecord::Base
belongs_to :subject, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)
现在,如果其中两个主题是例如:
class Event < ActiveRecord::Base
has_many :guests
after_create :create_activities
has_one :activity, as: :subject, dependent: :destroy
end
class Image < ActiveRecord::Base
has_many :tags
after_create :create_activities
has_one :activity, as: :subject, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)
将create_activities定义为
def create_activities
Activity.create(subject: self)
end
Run Code Online (Sandbox Code Playgroud)
客人和标签定义为:
class Guest < ActiveRecord::Base
belongs_to :event
end
class Tag < ActiveRecord::Base
belongs_to :image
end
Run Code Online (Sandbox Code Playgroud)
如果我们查询记录的最后20个活动,我们可以这样做:
Activity.order(created_at: :desc).limit(20)
Run Code Online (Sandbox Code Playgroud)
我们有第一个N + 1查询问题,我们可以通过以下方式解决:
Activity.includes(:subject).order(created_at: :desc).limit(20)
Run Code Online (Sandbox Code Playgroud)
但是,当我们呼叫访客或标签时,我们会遇到另一个N + 1查询问题.
为了能够使用分页,解决这个问题的正确方法是什么?
performance activerecord ruby-on-rails polymorphic-associations
ActiveRecord::ConnectionAdapters::Column.value_to_boolean在轨道3.2中是否有"酷孩子认可"的替代品?
我有一个配方模型,其中包含很多成分,每种成分都属于一个项目.在我的高级搜索表单中,我希望用户选择多种成分,让Ransack找到包含用户选择的所有成分的配方.
我尝试了以下搜索字段:
= f.collection_select(:ingredients_item_id_in, Item.all, :id, :name, {}, {multiple: true})
Run Code Online (Sandbox Code Playgroud)
但从逻辑上讲,这会导致显示的所有配方都含有任何选定的成分.
由于一条记录不能包含多个item_id值,因此更改:ingredients_item_id_in为:ingredients_item_id_in_all不正确的查询结果.
有关在Ransack中创建此搜索参数的任何想法,还是应该为此创建子查询?
根据要求,我的控制器搜索方法:
def search
@q = Recipe.ransack(params[:q])
@recipes = @q.result(distinct: true).include_related_models.published
end
Run Code Online (Sandbox Code Playgroud) 我正在创建一个这样的foo对象:
@foo = Foo.new(foo_params)
@foo.bar = Bar.where(name: "baz").first_or_create
Run Code Online (Sandbox Code Playgroud)
但是我还需要做其他一些事情.所以,我想过重写Foo初始化方法来做这样的事情:
class Foo < ApplicationRecord
def initialize(*args, BarName)
@foo = super
@foo.bar = Bar.where(name: BarName).first_or_create
end
end
Run Code Online (Sandbox Code Playgroud)
并称之为:
@foo = Foo.new(foo_params, "baz")
Run Code Online (Sandbox Code Playgroud)
但是Foo是一个ApplicationRecord,似乎不建议覆盖ApplicationRecord初始化方法.
那怎么能这样呢?还有其他想法吗?这会初始化压倒一切吗?
我正处于升级过程中,遇到了一些问题.
这是我的错误:
/Users/jay/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activesupport-4.1.6/lib/active_support/core_ext/hash/keys.rb:71:in`block in assert_valid_keys':未知密钥::订单.有效密钥为:: class_name,:class,:foreign_key,:validate,:autosave,:table_name,:before_add,:after_add,:before_remove,:after_remove ,:extend,: primary_key ,: dependent,:as,:through,: source,:source_type,:inverse_of,:counter_cache,:join_table(ArgumentError)
它与我的示波器有关吗?例如:
scope :total_views, order('total_views DESC')
要么
default_scope { order: :sort_order }
要么
scope :recent, order: 'created_at desc'
我有一堆使用顺序的范围,发生了什么?
我有一个跨越多个表的查询,最终使用Active Model Serializers来呈现数据.目前,大部分时间都花在序列化器上,因为我不得不从序列化器本身查询一些数据.我想找到一种方法来加快速度,这可能不是使用AMS(这没关系).
我的数据模型如下:
Location
-> Images
-> Recent Images
-> Days Images
Image
-> User
Run Code Online (Sandbox Code Playgroud)
的recent_images和days_images是一样的images,但用范围做了where由天,筛选limit到6.
目前整个过程在本地需要大约15秒,在生产中需要2-4秒.我觉得我可以更快地执行这个,但我不完全确定如何修改我的代码.
获取Locations 的查询是:
ids = @company
.locations
.active
.has_image_taken
.order(last_image_taken: :desc)
.page(page)
.per(per_page)
.pluck(:id)
Location.fetch_multi(ids)
Run Code Online (Sandbox Code Playgroud)
fetch_multi来自identity_cache gem.然后这些结果击中了序列化器:
class V1::RecentLocationSerializer < ActiveModel::Serializer
has_many :recent_images, serializer: V1::RecentImageSerializer do
if scope[:view_user_photos]
object.fetch_recent_images.take(6)
else
ids = object.recent_images.where(user_id: scope[:current_user].id).limit(6).pluck(:id)
Image.fetch_multi(ids)
end
end
has_many :days_images do
if scope[:view_user_photos]
object.fetch_days_images
else
ids = object.days_images.where(user_id: scope[:current_user].id).pluck(:id)
Image.fetch_multi(ids) …Run Code Online (Sandbox Code Playgroud) 我有两个数组:
a = [nil, 1, nil]
b = [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
我想用第二个数组中的相关元素替换第一个数组中的nil元素:
[4, 1, 6]
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?
我有3个模型
借方和贷方非常相似。字段基本相同。我正在尝试对我的模型运行查询以返回用户为 current_user 的借方和贷方的所有字段
User.left_outer_joins(:debits, :credits).where("users.id = ?", @user.id)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,从用户返回所有字段的次数与贷记和借记中的记录一样多。
User.includes(:credits, :debits).order(created_at: :asc).where("users.id = ?", @user.id)
Run Code Online (Sandbox Code Playgroud)
它运行了 3 个查询,我认为它应该在一个查询中完成。
这个问题的第二部分是。如何将记录类型添加到查询中?
因为在来自贷方的记录中会有一个额外的字段来显示贷方,借方也是如此
我已经研究了 ActiveRecordUnion gem,但我没有看到它将如何解决这里的问题
我目前有一个页面,需要11秒钟才能加载。我正在使用Bullet Gem帮助我找到N + 1查询的发生位置。它给了我一些输出,但是我真的不知道该怎么做。这是Bullet的输出:
GET /events/1679/dashboard
USE eager loading detected
RSVP => [:tickets]
Add to your finder: :includes => [:tickets]
Call stack
/Users/cameronbass/Desktop/Work/blackbird-rsvp/app/decorators/rsvp_decorator.rb:54:in `tickets?'
/Users/cameronbass/Desktop/Work/blackbird-rsvp/app/views/accepted_rsvps/_list.html.erb:33:in `block in _app_views_accepted_rsvps__list_html_erb___1211423417683052584_70339569780320'
Run Code Online (Sandbox Code Playgroud)
告诉我放在这条线上
def tickets?
rsvp.tickets.any?
end
Run Code Online (Sandbox Code Playgroud)
这是关联:
has_many :tickets, through: :attendees
Run Code Online (Sandbox Code Playgroud)
Attendee.rb
has_one :ticket
Run Code Online (Sandbox Code Playgroud) 我想转换数组
[[:name1, :value1], [:name2, :value2]]
Run Code Online (Sandbox Code Playgroud)
到数组
[[:value1, :name1], [:value2, :name2]]
Run Code Online (Sandbox Code Playgroud)
做这个的最好方式是什么?
activerecord ×8
ruby ×4
arrays ×2
bullet ×1
deprecated ×1
overriding ×1
performance ×1
ransack ×1
upgrade ×1