如何在ActiveRecord中设置默认值?
我看到Pratik的一篇文章描述了一段丑陋,复杂的代码:http://m.onkey.org/2007/7/24/how-to-set-default-values-in-your-model
class Item < ActiveRecord::Base
def initialize_with_defaults(attrs = nil, &block)
initialize_without_defaults(attrs) do
setter = lambda { |key, value| self.send("#{key.to_s}=", value) unless
!attrs.nil? && attrs.keys.map(&:to_s).include?(key.to_s) }
setter.call('scheduler_type', 'hotseat')
yield self if block_given?
end
end
alias_method_chain :initialize, :defaults
end
Run Code Online (Sandbox Code Playgroud)
我已经看到以下示例谷歌搜索:
def initialize
super
self.status = ACTIVE unless self.status
end
Run Code Online (Sandbox Code Playgroud)
和
def after_initialize
return unless new_record?
self.status = ACTIVE
end
Run Code Online (Sandbox Code Playgroud)
我也看到人们把它放在他们的迁移中,但我宁愿看到它在模型代码中定义.
是否有规范方法为ActiveRecord模型中的字段设置默认值?
我想制作一个activerecord记录的副本,更改进程中的单个字段(除了id).实现这一目标的最简单方法是什么?
我意识到我可以创建一个新记录,然后遍历每个字段逐个复制数据 - 但我认为必须有一个更简单的方法来做到这一点......
如:
@newrecord=Record.copy(:id) *perhaps?*
Run Code Online (Sandbox Code Playgroud) 我在命名时很糟糕,并且意识到我的Rails应用程序中的模型有更好的名称.
有没有办法使用迁移来重命名模型及其相应的表?
我在哪里可以找到可以在Ruby on Rails 4中使用的数据类型列表?如
text string integer float date 我一直在学习新的,我很想有一个我可以轻易参考的清单.
如何从ActiveRecord对象获取类名?
我有:
result = User.find(1)
Run Code Online (Sandbox Code Playgroud)
我试过了:
result.class
# => User(id: integer, name: string ...)
result.to_s
# => #<User:0x3d07cdc>"
Run Code Online (Sandbox Code Playgroud)
我只需要一个字符串中的类名(User在本例中).有没有办法呢?
我知道这是非常基本的,但我搜索了Rails和Ruby的文档,我找不到它.
是否有一个替代update_attributes不保存记录?
所以我可以这样做:
@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我知道我可以@car.model = 'Sierra',但我想在一条线上更新它们.
ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 rails-activerecord
使用rails 3样式我怎么写相反的:
Foo.includes(:bar).where(:bars=>{:id=>nil})
Run Code Online (Sandbox Code Playgroud)
我想找到id为非null的地方.我试过了:
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
Run Code Online (Sandbox Code Playgroud)
但那回归:
=> "SELECT \"foos\".* FROM \"foos\" WHERE (\"bars\".\"id\" = 1)"
Run Code Online (Sandbox Code Playgroud)
这绝对不是我需要的,而且几乎看起来像是ARel中的一个错误.
这更像是"为什么这样做的事情"这个问题,而不是"我不知道该怎么做"这个问题......
所以关于拉动你知道你将要使用的相关记录的福音就是使用,:include因为你将获得一个连接并避免一大堆额外的查询:
Post.all(:include => :comments)
Run Code Online (Sandbox Code Playgroud)
但是,当您查看日志时,没有发生加入:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Run Code Online (Sandbox Code Playgroud)
它正在采取一种捷径,因为它会立即提取所有注释,但它仍然不是连接(这是所有文档似乎都说的).我可以获得连接的唯一方法是使用:joins而不是:include:
Post.all(:joins => :comments)
Run Code Online (Sandbox Code Playgroud)
日志显示:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我有一个有六个关联的应用程序,在一个屏幕上我显示所有这些数据.似乎最好有一个加入查询而不是6个人.我知道在性能方面,进行连接而不是单个查询并不总是更好(事实上,如果你花费时间,看起来上面的两个单独的查询比连接更快),但是在所有文档之后我一直在阅读,我很惊讶地看到:include不像宣传的那样工作.
也许Rails的是认识到性能问题,并除非在某些情况下,不加入呢?
你如何删除ActiveRecord对象?
我查看了Active Record Querying,它没有任何删除我可以看到的内容.
删除id,
删除当前对象,如:user.remove,
你能根据where条款删除吗?
我正在尝试生成一个新模型并忘记引用另一个模型ID的语法.我自己查一下,但在我所有的Ruby on Rails文档链接中,我还没有弄清楚如何找到权威的来源.
$ rails g model Item name:string description:text(在这里reference:product或者references:product).但更好的问题是,未来我可以在哪里或如何轻松地寻找这种愚蠢?
注意:我已经学到了很难的方法,如果我错误地输入其中一个选项并运行我的迁移,那么Ruby on Rails将完全搞砸我的数据库...并且rake db:rollback对这种搞砸是无能为力的.我确定我只是不理解某些东西,但在我做之前......返回的"详细"信息rails g model仍让我感到搔痒......