标签: activerecord

如何在Ruby中替换重音拉丁字符?

我有一个ActiveRecord模型,Foo有一个name字段.我希望用户能够按名称搜索,但我希望搜索忽略大小写和任何重音.因此,我还存储了一个canonical_name要搜索的字段:

class Foo
  validates_presence_of :name

  before_validate :set_canonical_name

  private

  def set_canonical_name
    self.canonical_name ||= canonicalize(self.name) if self.name
  end

  def canonicalize(x)
    x.downcase.  # something here
  end
end
Run Code Online (Sandbox Code Playgroud)

我需要填写"这里的东西"来替换重音字符.还有什么比这更好的了

x.downcase.gsub(/[àáâãäå]/,'a').gsub(/æ/,'ae').gsub(/ç/, 'c').gsub(/[èéêë]/,'e')....
Run Code Online (Sandbox Code Playgroud)

而且,就此而言,由于我不在Ruby 1.9上,我不能将这些Unicode文字放在我的代码中.实际的正则表达式看起来会更加丑陋.

ruby unicode activerecord ruby-on-rails utf-8

70
推荐指数
7
解决办法
4万
查看次数

在Rails迁移中将一列更新为另一列的值

我在Rails应用程序中有一个包含数十万条记录的表,它们只有一个created_at时间戳.我正在添加编辑这些记录的功能,所以我想updated_at在表格中添加一个时间戳.在我的迁移中添加列,我想更新所有行以使新updated_at匹配旧created_at,因为这是Rails中新创建的行的默认值.我可以做一个find(:all)并遍历记录,但由于表的大小,这需要几个小时.我真正想做的是:

UPDATE table_name SET updated_at = created_at;
Run Code Online (Sandbox Code Playgroud)

在使用ActiveRecord而不是执行原始SQL的Rails迁移中有更好的方法吗?

migration activerecord timestamp ruby-on-rails

69
推荐指数
4
解决办法
4万
查看次数

"按"分组"计数"的结果?

这个查询

Message.where("message_type = ?", "incoming").group("sender_number").count
Run Code Online (Sandbox Code Playgroud)

会给我一个哈希值.

OrderedHash {"1234"=>21, "2345"=>11, "3456"=>63, "4568"=>100}
Run Code Online (Sandbox Code Playgroud)

现在我想按每组的数量排序.我该如何在查询中执行此操作.

activerecord ruby-on-rails sql-order-by ruby-on-rails-3

69
推荐指数
2
解决办法
6万
查看次数

Rails:schema.rb做什么?

我曾经认为db/schema.rbRails项目中存储了数据库模式,因此ActiveRecord可以知道它具有哪些表/列.

但早些时候我惊奇地注意到我的项目在删除后正常运行db/schema.rb!

那么,既然Rails没有它可以工作,那schema.rb真正做到了什么?

activerecord ruby-on-rails

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

如何在没有多个查询的情况下将Rails ActiveRecord链接到"where"子句?

我是一名PHP开发人员,学习Ruby on Rails的优点,我喜欢ActiveRecord,我注意到一些非常有趣的东西,这就是ActiveRecord方法检测方法链结束执行查询的方式.

@person = Person.where(name: 'Jason').where(age: 26)

# In my humble imagination I'd think that each where() executes a database query
# But in reality, it doesn't until the last method in the chain
Run Code Online (Sandbox Code Playgroud)

这个巫术是如何运作的?

activerecord ruby-on-rails

69
推荐指数
2
解决办法
4万
查看次数

Rails 3/Form没有Model:如何创建一个与模型无关的表单?

我有一个模型,我有一个视图,显示一个基于该模型创建新对象的表单.我们称之为那种形式Form1.

用户提交后Form1,将创建该对象.然后,我想在下一页上显示第二个表单Form2,该表单要求用户在将对象保存到数据库之前检查各种选项.

我的问题可能非常基本.我不知道如何创建Form2,因为它不直接与模型绑定.因为我是Rails新手,所以我只创建了以下表格:

form_for(@object) { |f| ... }
Run Code Online (Sandbox Code Playgroud)

@object 是从模型实例化的对象

问题:我不相信这种代码在我的目的下会起作用.我如何创造Form2,因为它不能基于@object@object模型?

我的应用程序中的一些细节:

Form1在重定向到OAuth服务器之前,站点接受values().

当用户在OAuth服务器上验证其凭据时,她将被重定向回我的站点.一个XML-RPC请求,然后获取关于用户的账户上的信息OAuth服务器.

XML响应可能表明用户只有一个帐户上的OAuth服务器.如果是这样,则从中检索一些值XML并将其添加到对象中 - 然后(最终)将其保存在数据库中 - 并将用户重定向到成功页面.

但是,如果XML响应表明用户在OAuth服务器上有多个帐户,我想显示一个表单(Form2),允许用户选择OAuth服务器上与我的站点关联的帐户.因此,Form2确实要求用户创建多少对象,而不是关于对象的特定属性.

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

68
推荐指数
3
解决办法
4万
查看次数

"警告:无法批量分配受保护的属性"

我已经使用RESTful技术生成模型(事实上,我正在使用Devise gem,它为我做了这个),并且我在模型中添加了名为first_name和last_name的新字段.迁移进展顺利.我将attr_accessor:first_name,:last_name添加到模型中,并期望它能正常工作.但是当我尝试使用Doctor.create({:first_name =>"MyName"})等大量分配新实例时,我收到错误,说我无法批量分配受保护的属性.

我认为使用attr_accessor的重点是绕过模型字段的保护.你能帮我理解这个消息吗?

编辑:哦,顺便说一下,记录也没有创建.我认为它们应该是因为这只是一个警告,但它们不在数据库中.

Edit2:这是我的模特

class Doctor < User
  has_many :patients
  has_many :prescriptions, :through=> :patients

  validates_presence_of :invitations, :on => :create, :message => "can't be blank"

  attr_accessor :invitations
end
Run Code Online (Sandbox Code Playgroud)

和模式,它没有first_name和last_name,因为它们是在users表中创建的,这是医生的祖先.我使用单表继承.

create_table :doctors do |t|
  t.integer :invitations

  t.timestamps
end
Run Code Online (Sandbox Code Playgroud)

这是用于更改users表的迁移

add_column :users, :first_name, :string
add_column :users, :last_name, :string
add_column :users, :type, :string
Run Code Online (Sandbox Code Playgroud)

编辑:这是种子文件.我不包括truncate_db_table方法,但它的工作原理.

%w{doctors patients}.each do |m|
  truncate_db_table(m)  
end  

Doctor.create(:invitations=>5, :email=>"email@gmail.com", :first_name=>"Name", :last_name=>"LastName")
Patient.create(:doctor_id=>1, :gender=>"male", :date_of_birth=>"1991-02-24")
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails devise

67
推荐指数
2
解决办法
10万
查看次数

Mongoid安装后使用Active Record生成器?

我通过Mongoid集成使用MongoDB,以及在项目中使用ActiveRecord.我想为活动记录生成迁移,而Mongoid是我运行时的默认值.

rails g migration
Run Code Online (Sandbox Code Playgroud)

有关如何将AR指定为迁移,模型等的默认生成器的任何想法?

谢谢!

activerecord ruby-on-rails mongodb mongoid

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

关于空belongs_to关联的最佳实践

想象一下以下情况:

我有一个dog模型和一个house模型.狗可以属于房子,房子可以有很多狗,所以:

Class Dog <  ActiveRecord::Base
  belongs_to :house
end

Class House < ActiveRecord::Base
  has_many :dogs
end
Run Code Online (Sandbox Code Playgroud)

现在,想象一下,我也想创造没有房子的狗.他们不属于房子.我是否仍然可以使用该关系结构,并且只是:house_id在创建它时不通知?

有更好的做法吗?

Obs.:我用这个类比来简化我的问题,但我的真实情况是:我有一个模型,用户可以生成它的实例.他还可以创建这些实例的集合,但是他可以将一个实例留在集合之外.

ruby activerecord ruby-on-rails

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

ActiveRecord :: StatementInvalid:PG InFailedSqlTransaction

我正在尝试创建一个ActiveRecord Object.But我在创建它时遇到此错误.

(0.1ms)  ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR:  current transaction is       aborted, commands ignored until end of transaction block
Run Code Online (Sandbox Code Playgroud)

关于这个问题的任何想法的人.

postgresql activerecord ruby-on-rails rollback pg

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