标签: rails-activerecord

在rails模型中动态生成范围

我想动态生成范围.假设我有以下型号:

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

12
推荐指数
3
解决办法
6908
查看次数

默认情况下,ActiveRecord中的.order方法参数是否已清理?

我正在尝试将字符串传递给.order方法,例如

Item.order(orderBy)
Run Code Online (Sandbox Code Playgroud)

我想知道orderBy是否默认清理,如果没有,那么清理它的最佳方法是什么.

ruby-on-rails rails-activerecord

12
推荐指数
3
解决办法
5740
查看次数

Rails将父错误与子错误合并

我有以下两种(消毒/程式化)模型:

 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

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

重新启用Rails 4 auto-EXPLAIN

对慢速运行的SQL查询进行自动EXPLAIN.此功能已从Rails 4中删除.

config.active_record.auto_explain_threshold_in_seconds = 0.5
Run Code Online (Sandbox Code Playgroud)

在受控制的情况下,我们发现它很有用.我找不到以下问题的答案.

  1. 删除auto-EXPLAIN的基本原理是什么?
    (我确定原因是合理的,但我找不到它们是什么.)

  2. 有没有办法在我的Rails 4代码库中重新引入auto-EXPLAIN?
    (找不到宝石,也没有任何在线信息)

ruby postgresql-9.2 ruby-on-rails-4 rails-activerecord

12
推荐指数
1
解决办法
3017
查看次数

在Ruby on Rails Activerecord中使用eager_load将可计算列添加到multi-table select子句

我有一个有很多连接的查询,我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操作来自关联addressesous表的数据.

我正在获得下一个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)

ruby-on-rails rails-activerecord

12
推荐指数
2
解决办法
1062
查看次数

使用Postgres强制转换将动态列名安全地传递给ActiveRecord查询?

我在我的应用程序中没有日期查询时花了很多时间,我想抽出一些问题.

所以说我有一个带有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注入.

postgresql activerecord ruby-on-rails rails-activerecord

12
推荐指数
1
解决办法
3017
查看次数

rails has_many:通过has_many:through

我想知道我可以在多大程度上使用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呢?是否可以关联一个协会,可以这么说?

ruby orm ruby-on-rails associations rails-activerecord

11
推荐指数
1
解决办法
7081
查看次数

Rails模型中的条件验证

我有一个Rails 3.2.18应用程序,我正在尝试对模型进行一些条件验证.

在呼叫模型中有两个字段:location_id(与预定义位置列表的关联)和:location_other(可以是某人可以键入字符串的文本字段,或者在这种情况下是地址).

我希望能够做的是在创建对以下位置的调用时使用验证:location_id或:location_other被验证存在.

我已经阅读了Rails验证指南并且有点困惑.希望有人可以通过条件轻松地阐明如何轻松地做到这一点.

validation activerecord ruby-on-rails ruby-on-rails-3 rails-activerecord

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

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)

理想情况下,我们可以用括号来表示更复杂的操作顺序,但这不是必需的.

是否有宝石或图案支持这个?

ruby activerecord ruby-on-rails rails-activerecord

11
推荐指数
1
解决办法
931
查看次数

ActiveRecord采用SQL

我知道这两个语句执行相同的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语句,因为结果是一个数组.

请考虑到这是问题的简化.拔出的属性数量可以任意高.

任何帮助,将不胜感激.

activerecord ruby-on-rails rails-activerecord

11
推荐指数
1
解决办法
973
查看次数