考虑下面的表创建脚本:
create_table :foo do |t|
t.datetime :starts_at, :null => false
end
Run Code Online (Sandbox Code Playgroud)
是否可以将默认值设置为当前时间?
我试图在rails中找到DB独立的等价物,用于下面给出的SQL列定义:
Oracle语法
start_at DATE DEFAULT SYSDATE()
Run Code Online (Sandbox Code Playgroud)
MySQL语法
start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
要么
start_at DATETIME DEFAULT NOW()
Run Code Online (Sandbox Code Playgroud) 我有3张桌子
items (columns are: name , type)
history(columns are: date, username, item_id)
user(username, password)
Run Code Online (Sandbox Code Playgroud)
当用户说"ABC"登录并创建新项目时,将使用以下after_create过滤器创建历史记录.如何通过此过滤器将此用户名"ABC"分配给历史记录表中的用户名字段.
class Item < ActiveRecord::Base
has_many :histories
after_create :update_history
def update_history
histories.create(:date=>Time.now, username=> ?)
end
end
Run Code Online (Sandbox Code Playgroud)
我在session_controller中的登录方法
def login
if request.post?
user=User.authenticate(params[:username])
if user
session[:user_id] =user.id
redirect_to( :action=>'home')
flash[:message] = "Successfully logged in "
else
flash[:notice] = "Incorrect user/password combination"
redirect_to(:action=>"login")
end
end
end
Run Code Online (Sandbox Code Playgroud)
我没有使用任何身份验证插件.如果有人能告诉我如何在不使用插件(如userstamp等)的情况下实现这一点,我将不胜感激.
我有一个emp
包含以下结构和数据的表:
name dept salary
----- ----- -----
Jack a 2
Jill a 1
Tom b 2
Fred b 1
Run Code Online (Sandbox Code Playgroud)
当我执行以下SQL时:
SELECT * FROM emp GROUP BY dept
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
name dept salary
----- ----- -----
Jill a 1
Fred b 1
Run Code Online (Sandbox Code Playgroud)
在什么基础上服务器决定返回吉尔和弗雷德并排除杰克和汤姆?
我在MySQL中运行此查询.
注1:我知道查询本身没有意义.我试图用'GROUP BY'方案调试问题.我试图理解为此目的的默认行为.
注2:我习惯于编写与GROUP BY子句相同的SELECT子句(减去聚合字段).当我遇到上述行为时,我开始想知道我是否可以依赖于以下场景:从emp表中选择薪水是dept中最低/最高的行.例如:像这样的SQL语句适用于MySQL:
SELECT A.*, MIN(A.salary) AS min_salary FROM emp AS A GROUP BY A.dept
Run Code Online (Sandbox Code Playgroud)
我没有找到任何描述这种SQL工作原理的材料,更重要的是如果我能够始终如一地依赖这种行为.如果这是一个可靠的行为,那么我可以避免以下查询:
SELECT A.* FROM emp AS A WHERE A.salary = (
SELECT MAX(B.salary) FROM emp B WHERE B.dept = A.dept)
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的heroku应用程序设置SSL.我使用的是基于主机名的SSL插件.heroku 文档说明如下:
Hostname based SSL will not work with root domains as it relies on CNAME
aliasing of your custom domain names. CNAME aliasing of root domains is
an RFC violation.
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,当我使用www子域访问网站时,一切都运行良好,即https://www.foo.com.当我访问https://foo.com时,浏览器会抱怨,因为提供的证书是针对heroku.com的.
我得出结论,我必须将foo.com的流量重定向到www.foo.com以解决此问题.我正在考虑以下方法:
1)基于DNS的重定向
该DNS提供商Zerigo 支持的重定向记录.我在SO上遇到过关于类似主题的问题.我尝试了解决方案,它只适用于HTTP重定向(Zerigo文档证实了这一点).
我的Zerigo配置:
foo.com A x.x.x.x
foo.com redirect http://www.foo.com
www.foo.com CNAME zzz.amazonaws.com
Run Code Online (Sandbox Code Playgroud)
2)基于机架的重定向
添加基于机架的中间件以执行重定向.该规范的主机宝石提供这样的支持.
use CanonicalHost do
case Rails.env.to_sym
when :staging then 'staging.foo.com'
when :production then 'www.foo.com'
end …
Run Code Online (Sandbox Code Playgroud) 我有两节课A
,和B
.类B
重写了类的foo
方法A
.Class B
有一个bar
方法,我想调用foo
超类的方法.这种电话的语法是什么?
class A
def foo
"hello"
end
end
class B < A
def foo
super + " world"
end
def bar
# how to call the `foo` method of the super class?
# something similar to
super.foo
end
end
Run Code Online (Sandbox Code Playgroud)
对于类方法,我可以通过显式地为类名添加前缀来在继承链上调用方法.我想知道是否有类似的习惯用法.
class P
def self.x
"x"
end
end
class Q < P
def self.x
super + " x"
end
def self.y
P.x
end
end
Run Code Online (Sandbox Code Playgroud)
编辑 …
我有一个用于发送电子邮件的ERB模板.
Name: <%= @user.name %>
<% if @user.phone.present? %>
Phone: <%= @user.phone %>
<% end %>
Address: <%= @user.address %>
Run Code Online (Sandbox Code Playgroud)
我试图删除之间的空白行Name
和Address
何时Phone
为空.
返回结果
Name: John Miller
Address: X124 Dummy Lane, Dummy City, CA
Run Code Online (Sandbox Code Playgroud)
预期结果
Name: John Miller
Address: X124 Dummy Lane, Dummy City, CA
Run Code Online (Sandbox Code Playgroud)
我试图使用<%--%>
标签(删除尾随的新行)没有任何成功.
Name: <%= @user.name %>
<%- if @user.phone.present? -%>
Phone: <%= @user.phone %>
<%- end -%>
Address: <%= @user.address -%>
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
PS:我在Rails 2.3.8上.
注1
现在,我正在使用ruby hackery解决这个问题.
助手方法:
def …
Run Code Online (Sandbox Code Playgroud) 在YAML中是否有自定义标记,以便在YAML文件中包含YAML文件?
#E.g.:
--- !include
filename: another.yml
Run Code Online (Sandbox Code Playgroud)
前一段时间问了一个类似的问题,没有相关的答案.
我想知道是否有是Ruby一些自定义标签类似这样一个为Python.
看起来像Paperclip不尊重ActiveRecord脏模型.如何检测after_save
回调中的更改.
class User
has_attachment :avatar
after_save :do_something
def do_something
if name_changed?
#
end
# How to determine avatar was changed?
#if avatar_changed?
# #
#end
end
end
Run Code Online (Sandbox Code Playgroud)
注意
我知道我可以before_save
通过avatar.dirty?
调用检测回调的变化,但dirty
保存后该标志设置为false.
我可以添加处理器,但是我需要在保存模型数据后执行我的操作.
我经常编写代码以在遇到nil/empty值时提供默认值.
例如:
category = order.category || "Any"
# OR
category = order.category.empty? ? "Any" : order.category
Run Code Online (Sandbox Code Playgroud)
我即将扩展该try
方法来处理这个习语.
category = order.try(:category, :on_nill => "Any")
# OR
category = order.try(:category, :on_empty=> "Any")
Run Code Online (Sandbox Code Playgroud)
我想知道Rails/Ruby是否有一些方法来处理这个习惯用法?
注意:
我试图消除重复的 || / or / ?
基于操作员的习语.
基本上我正在寻找try
处理默认替换方案的等效方法.
没有try
方法:
product_id = user.orders.first.product_id unless user.orders.first.nil?
Run Code Online (Sandbox Code Playgroud)
随着try
方法:
product_id = user.orders.first.try(:product_id)
Run Code Online (Sandbox Code Playgroud)
很容易实现处理这个习惯用法的通用方法,但我想确保不重新发明轮子.
我正在经营一名工作延迟的工人.当我调用该foo
方法时,工作人员打印hello
.
class User
def foo
puts "Hello"
end
handle_asynchronously :foo
end
Run Code Online (Sandbox Code Playgroud)
如果我对foo
方法进行了一些更改,我必须重新启动worker才能反映更改.在开发模式中,这可能变得非常烦人.
我试图找到一种方法来为每个请求重新加载有效载荷类(在本例中为User类).我尝试使用Monkey修补DelayedJob库,以便require_dependency
在有效负载方法调用之前调用.
module Delayed::Backend::Base
def payload_object_with_reload
if Rails.env.development? and @payload_object_with_reload.nil?
require_dependency(File.join(Rails.root, "app", "models", "user.rb"))
end
@payload_object_with_reload ||= payload_object_without_reload
end
alias_method_chain :payload_object, :reload
end
Run Code Online (Sandbox Code Playgroud)
这种方法不起作用,因为使用的类require_dependency
需要在调用之前重新加载,我还没有想出如何做到这一点.我花了一些时间阅读调度程序代码,以弄清楚Rails如何为每个请求重新加载类.我无法找到重新加载代码.
以前有人试过这个吗?你怎么建议我继续?或者你有任何指针来查找Rails类重载代码?