【发布时间】:2015-02-10 14:18:35
【问题描述】:
我有一个评论部分,允许用户在他们的聚会后撰写对另一个用户的评论。我想允许用户在他们的聚会开始时间之后写评论。
我遇到的问题是,在创建两个用户之间的聚会后,立即允许用户在聚会开始时间之前为彼此撰写评论。我创建finished_meetup? 的方法一直都是正确的。我认为这是由于我的 start_time 显示错误。
在控制台中,如果我预订了晚上 8:30 的聚会,我会得到以下作为 start_time start_time: "2000-01-01 20:30:00" 的信息。日期附加到时间,不能删除,因为“Represent a time with no date in ruby”。
我将如何设置方法 finished_meetup? 以允许在聚会之后而不是事先进行评论。
shema.rb:
create_table "user_meetups", force: true do |t|
t.integer "user_id"
t.integer "friend_id"
t.string "state"
t.datetime "created_at"
t.datetime "updated_at"
t.date "start_date"
t.time "start_time"
用户.rb
def find_corresponding_friend_id(friend_id)
self.user_meetups.where(friend_id:friend_id).present?
end
def already_reviewed
self.reviews.map{|d| d.review_writer_id}
end
def finished_meetup?
user_meetups.where("start_time < ?", Time.new("2000/#{Time.now.strftime("%m/%d")}"))
end
用户/show.html.erb
<% if @user.find_corresponding_friend_id(current_user.id) && @user.already_reviewed.empty? && @user.finished_meetup? %>
user_meetup.rb
class UserMeetup < ActiveRecord::Base
belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'
validates :start_date, :start_time, presence: true
# attr_accessor :user, :friend, :user_id, :friend_id, :state
after_destroy :delete_mutual_meetup!
state_machine :state, initial: :pending do
after_transition on: :accept, do: [:accept_mutual_meetup!]
after_transition on: :block, do: [:block_mutual_meetup!]
after_transition on: :unblock, do: [:accept_mutual_meetup!]
state :requested
state :blocked
event :accept do
transition any => :accepted
end
event :block do
transition any => :blocked
end
event :unblock do
transition any => :accepted
end
end
def self.request(start_date, start_time, location, description, learners, user1, user2)
transaction do
# Rails.logger.info "user1 is #{user1.inspect}"
# Rails.logger.info "user2 is #{user2.inspect}"
meetup1 = UserMeetup.create!(start_date: start_date, start_time: start_time, user: user1, friend: user2, state: 'pending')
# Rails.logger.info "meetup1 is #{meetup1.inspect}"
meetup2 = UserMeetup.create!(start_date: start_date, start_time: start_time, user: user2, friend: user1, state: 'requested' )
# meetup1.send_request_email
# meetup1
end
end
【问题讨论】:
-
如果你有开始日期和开始时间,为什么要分开存储呢?为什么没有
t.datetime 'start_at'?然后您可以将其与当前日期时间进行比较以了解是否允许。 -
因为没办法,只能这样,查看链接stackoverflow.com/questions/6359978/…
-
我明白了,我自己也遇到过这个问题,但我认为我在您的数据模型中遗漏了一些东西。那么
start_date和start_time彼此不相关吗?明天下午 4 点(忽略时区)举行的聚会是否会在表中获得一个条目,其中start_date设置为2014-12-12,start_time 设置为16:00? -
如果我在 12 月 9 日下午 6 点在控制台中进行聚会,它看起来像 start_date: "2014-12-09", start_time: "2000-01-01 18:00:00"
-
为什么?!这是没有意义的。在任何情况下,无论你如何存储东西,你都可以随心所欲地对其进行操作。
标签: ruby postgresql date time strftime