假设我有拥有项目的用户:
class User < ActiveRecord::Base
has_many :items
end
Run Code Online (Sandbox Code Playgroud)
class Item < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
现在我想向 item 添加一个类方法以创建自定义记录:
def self.create_personalized
create description: "#{user.name}' item"
end
Run Code Online (Sandbox Code Playgroud)
但是当然,由于这是一个类方法,因此user是未定义的。但是如果我用 using 调用它user.items.create_personalized,那么通过关系有一个关联的用户。我知道这Item.create_personalized是知道用户,因为这有效:
def self.create_personalized
item = create
item.update_attribute :description, "#{item.user.name}'s item"
end
Run Code Online (Sandbox Code Playgroud)
但显然这不是访问所有者对象的最佳方式。正确的方法是什么?
我需要能够接收用户输入的时间戳,带有可选的时区组件,验证它是否是有效的ISO 8601时间表示,并根据用户配置的时区进行解析.
我在Ruby 2.3上使用Rails 4.2.6.我曾希望Time.zone(ActiveSupport::TimeZone)有一个等效的实现,Time::iso8601以便我可以挽救ArgumentError异常以确定用户输入是否是有效的ISO 8601时间表示.然后我可以这样做:
user_time_zone = 'America/Los_Angeles' # Would actually be from user's stored settings
params = {when: '2016-04-01T01:01:01'} # Would actually be from user input
# Would actually use Time::use_zone in around_action filter
Time.use_zone(user_time_zone) do
timestamp = Time.zone.iso8601 params[:when]
end
Run Code Online (Sandbox Code Playgroud)
但是,唉,不存在这样的方法.我找不到同等的一个.
我不能使用Time.zone.parse,因为它将模糊日期视为有效(例如Time.zone.parse '04/11/16' # => Tue, 16 Nov 0004 00:00:00 LMT -07:52).
到目前为止,我能够提出的最佳选择是:
Time.use_zone(user_time_zone) do
old_tz = ENV['TZ']
ENV['TZ'] …Run Code Online (Sandbox Code Playgroud)