【发布时间】:2015-01-07 08:07:10
【问题描述】:
我有以下模型订阅类
create_table "subscriptions", force: true do |t|
t.integer "user_id"
t.integer "course_id"
t.datetime "date_subscription_start"
t.datetime "date_subscription_end"
t.string "subscription_type"
t.datetime "created_at"
t.datetime "updated_at"
end
我想让用户能够再次订阅同一个课程,如果他们出于某种原因想要重新学习它。我的逻辑是,如果课程/用户组合的 date_subscription_end 日期在新创建时已经过去,则应该只能注册课程。如果在创建时存在具有相同 user_id 和 course_id 且订阅结束日期在未来的订阅,则它应该被拒绝,因为这意味着用户仍在学习该课程。
所以是这样的:
validates :user_id,
uniqueness: {
scope: :course_id,
message: "User is already subscribed to this course"
},
unless: Proc.new { |a|
Subscription.where(user_id: a.user_id, course_id: a.course_id) &&
Subscription.where('date_subscription_end < ?', Time.now)
}
基本上,rails 必须遍历订阅表,找到所有具有相同主键的订阅并检查它们的 date_subscription_end 属性。我觉得我很接近但缺少一些基本的东西。
谢谢! 让
编辑:出于某种原因,“你好!”帖子顶部的问候语被删除
【问题讨论】:
-
我还想补充一点,在 Rails 和 Ruby 社区中,使用
unless实际上被认为是一种不好的做法。请参阅这些语法样式指南:github.com/bbatsov/rails-style-guidegithub.com/bbatsov/ruby-style-guide#syntax
标签: ruby-on-rails validation model proc