我想动态生成范围.假设我有以下型号:
class Product < ActiveRecord::Base
POSSIBLE_SIZES = [:small, :medium, :large]
scope :small, where(size: :small)
scope :medium, where(size: :medium)
scope :large, where(size: :large)
end
Run Code Online (Sandbox Code Playgroud)
我们可以scope用基于POSSIBLE_SIZES常量的东西替换调用吗?我想我是在违反DRY来重复它们.
ruby metaprogramming ruby-on-rails ruby-on-rails-3 rails-activerecord
我正在尝试将字符串传递给.order方法,例如
Item.order(orderBy)
Run Code Online (Sandbox Code Playgroud)
我想知道orderBy是否默认清理,如果没有,那么清理它的最佳方法是什么.
我有以下两种(消毒/程式化)模型:
class DrivingExam < ActiveRecord::Base
belongs_to :dmv_rules
has_many :invigilator_assignments, as: :assignable
has_many :invigilator, through: :invigilator_assignments
validate do |record|
record.invigilator_assignments.each do |i|
next if i.valid?
i.errors.full_messages.each do |msg|
errors.add_to_base(msg)
end
end
end
end
class InvigilatorAssignment < ActiveRecord::Base
attr_accessible :invigilator_id
belongs_to :assignable, polymorphic: true
belongs_to :invigilator
validates :invigilator_id, presence: true
validates_each :invigilator do |record, attr, value|
if record.assignable.is_a?(DrivingExam) && !value.no_scheduling_conflicts?
record.errors.add attr, "This Invigilator has a scheduling conflict"
end
end
end
Run Code Online (Sandbox Code Playgroud)
DrivingExamController通过以下方式调用这些:
if @driving_exam.save
Run Code Online (Sandbox Code Playgroud)
预期的行为是模型应该在验证时返回false并将子消息加入父错误哈希并将其传递给控制器.
相反的是,页面无法使用422(这很奇怪)保存(这很好)并且不传递消息.
通过puts在上面的代码中添加语句,我已经确定:
1)if条件validates_each …
ruby validation associations ruby-on-rails-3 rails-activerecord
对慢速运行的SQL查询进行自动EXPLAIN.此功能已从Rails 4中删除.
config.active_record.auto_explain_threshold_in_seconds = 0.5
Run Code Online (Sandbox Code Playgroud)
在受控制的情况下,我们发现它很有用.我找不到以下问题的答案.
删除auto-EXPLAIN的基本原理是什么?
(我确定原因是合理的,但我找不到它们是什么.)
有没有办法在我的Rails 4代码库中重新引入auto-EXPLAIN?
(找不到宝石,也没有任何在线信息)
我有一个有很多连接的查询,我eager_load当时正在进行一些关联.我需要计算一些值作为其中一个模型的属性.
所以,我正在尝试这段代码:
ServiceObject
.joins([{service_days: :ou}, :address])
.eager_load(:address, :service_days)
.where(ous: {id: OU.where(sector_code: 5)})
.select('SDO_CONTAINS(ous.service_area_shape, SDO_GEOMETRY(2001, 8307, sdo_point_type(addresses.lat, addresses.lng, NULL), NULL, NULL) ) AS in_zone')
Run Code Online (Sandbox Code Playgroud)
其中SQL函数调用select操作来自关联addresses和ous表的数据.
我正在获得下一个SQL(因此我的in_zone列计算并在所有eager_loaded模型的其他列之前作为第一列返回):
SELECT SDO_CONTAINS(ous.service_area_shape, SDO_GEOMETRY(2001, 8307, sdo_point_type(addresses.lat, addresses.lng, NULL), NULL, NULL) ) AS in_zone, "SERVICE_OBJECTS"."ID" AS t0_r0, "SERVICE_OBJECTS"."TYPE" AS t0_r1, <omitted for brevity> AS t2_r36 FROM "SERVICE_OBJECTS" INNER JOIN "SERVICE_DAYS" ON "SERVICE_DAYS"."SERVICE_OBJECT_ID" = "SERVICE_OBJECTS"."ID" INNER JOIN "OUS" ON "OUS"."ID" = "SERVICE_DAYS"."OU_ID" INNER JOIN "ADDRESSES" ON …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中没有日期查询时花了很多时间,我想抽出一些问题.
所以说我有一个带有DateTime starts_at字段的模型:
Shift.where('starts_at::time > ?', '20:31:00.00')
-> SELECT "shifts".* FROM "shifts" WHERE (starts_at::time > '20:31:00.00')
Run Code Online (Sandbox Code Playgroud)
这正确地返回大于时间20:31的所有'starts_at'值.
我想动态地将列名传递给查询,所以我可以这样做:
Shift.where('? > ?', "#{column_name}::time", '20:31:00.00').
-> SELECT "shifts".* FROM "shifts" WHERE ('starts_at::time' > '20:31:00.00')
Run Code Online (Sandbox Code Playgroud)
在此示例中,这不起作用,因为搜索starts_at::time作为字符串执行,而不是作为具有强制转换的列time.
如何使用强制column_name转换安全地传入查询::time?虽然这不会接受用户输入,但我仍然希望确保考虑SQL注入.
我想知道我可以在多大程度上使用Rails中的关联.考虑以下因素:
class User < ActiveRecord::Base
has_one :provider
has_many :businesses, :through => :provider
end
class Provider < ActiveRecord::Base
has_many :businesses
has_many :bids, :through => :businesses
belongs_to :user
end
class Business < ActiveRecord::Base
has_many :bids
belongs_to :provider
end
class Bid < ActiveRecord::Base
belongs_to :business
end
Run Code Online (Sandbox Code Playgroud)
我可以设置这些漂亮的快捷方式User.businesses,Provider.bids但是做些什么User.bids呢?是否可以关联一个协会,可以这么说?
我有一个Rails 3.2.18应用程序,我正在尝试对模型进行一些条件验证.
在呼叫模型中有两个字段:location_id(与预定义位置列表的关联)和:location_other(可以是某人可以键入字符串的文本字段,或者在这种情况下是地址).
我希望能够做的是在创建对以下位置的调用时使用验证:location_id或:location_other被验证存在.
我已经阅读了Rails验证指南并且有点困惑.希望有人可以通过条件轻松地阐明如何轻松地做到这一点.
validation activerecord ruby-on-rails ruby-on-rails-3 rails-activerecord
我想知道在Rails中解析文本查询的最佳方法是什么,允许用户包含逻辑运算符?
我希望用户能够输入其中任何一个或等效的:
# searching partial text in emails, just for example
# query A
"jon AND gmail" #=> ["jonsmith@gmail.com"]
# query B
"jon OR gmail" #=> ["jonsmith@gmail.com", "sarahcalaway@gmail.com"]
# query C
"jon AND gmail AND smith" #=> ["jonsmith@gmail.com"]
Run Code Online (Sandbox Code Playgroud)
理想情况下,我们可以用括号来表示更复杂的操作顺序,但这不是必需的.
是否有宝石或图案支持这个?
我知道这两个语句执行相同的SQL:
运用 select
User.select(:email)
# SELECT `users`.`email` FROM `users`
Run Code Online (Sandbox Code Playgroud)
并使用 pluck
User.all.pluck(:email)
# SELECT `users`.`email` FROM `users`
Run Code Online (Sandbox Code Playgroud)
现在我需要获取从每个方法派生的SQL语句.鉴于该select方法返回一个ActiveRecord::Relation,我可以调用该to_sql方法.但是,我无法弄清楚如何获取从ActiveRecord::Relation对象的pluck操作派生的SQL语句,因为结果是一个数组.
请考虑到这是问题的简化.拔出的属性数量可以任意高.
任何帮助,将不胜感激.