我有一个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文字放在我的代码中.实际的正则表达式看起来会更加丑陋.
我在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迁移中有更好的方法吗?
这个查询
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)
现在我想按每组的数量排序.我该如何在查询中执行此操作.
我曾经认为db/schema.rb在Rails项目中存储了数据库模式,因此ActiveRecord可以知道它具有哪些表/列.
但早些时候我惊奇地注意到我的项目在删除后正常运行db/schema.rb!
那么,既然Rails没有它可以工作,那schema.rb真正做到了什么?
我是一名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)
这个巫术是如何运作的?
我有一个模型,我有一个视图,显示一个基于该模型创建新对象的表单.我们称之为那种形式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确实要求用户创建多少对象,而不是关于对象的特定属性.
我已经使用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) 我通过Mongoid集成使用MongoDB,以及在项目中使用ActiveRecord.我想为活动记录生成迁移,而Mongoid是我运行时的默认值.
rails g migration
Run Code Online (Sandbox Code Playgroud)
有关如何将AR指定为迁移,模型等的默认生成器的任何想法?
谢谢!
想象一下以下情况:
我有一个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.:我用这个类比来简化我的问题,但我的真实情况是:我有一个模型,用户可以生成它的实例.他还可以创建这些实例的集合,但是他可以将一个实例留在集合之外.
我正在尝试创建一个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)
关于这个问题的任何想法的人.
activerecord ×10
ruby-on-rails ×10
ruby ×2
devise ×1
migration ×1
mongodb ×1
mongoid ×1
pg ×1
postgresql ×1
rollback ×1
sql-order-by ×1
timestamp ×1
unicode ×1
utf-8 ×1