ruby-on-rails - Rails 一对多 : Validate field value

标签 ruby-on-rails postgresql validation activerecord psql

假设我有两个类

    class student < ApplicationRecord
      has_many :books
    end

    class Book < ApplicationRecord
      belongs_to :student
    end

每本书都有一个 bool 变量read,表示该书是否已读。每个学生只能阅读一本书。如果学生的任何一本书被标记为已读,他的其他书将无法再阅读。

是否有 PSQL 或事件记录验证来允许此约束发生?

具体来说,book.update_attributes!(read: true) 将检查其他相关书籍。 DB 约束会更受欢迎。

非常感谢!

问题陈述更新:

read 成为时间戳 read_at,book.update_attributes!(read_at: Time.zone.now) 将检查学生之前是否阅读过任何其他书籍。

最佳答案

在 bool 型 read 字段和整数 student_id 字段上添加一个唯一的部分索引,其中 read 等于 true

add_column :books, :read, :boolean, null: false, default: false
add_index :books, [:student_id, :read], unique: true, where: "read=true"

在 Book 模型中添加仅在 book.read == true

时才有效的唯一验证
validates :read, uniqueness: { scope: :student_id }, if: -> (book) { book.read }

关于ruby-on-rails - Rails 一对多 : Validate field value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43483032/

相关文章:

ruby-on-rails - 在 Ruby on Rails 中从数据库预加载数据

PostgreSQL 继承 : are parent-table triggers inherited?

ASP.NET - 验证 UserControl 内的控件

c++ - 验证分数范围并为男性和女性设置不同的差点范围 C++

ruby-on-rails - 如果所有其他变量和输出都已知,是否可以求解 ruby​​ 中哈希的输入值? ( ruby )

ruby-on-rails - Rails 4 应用程序 - 在哪里放置自定义 jQuery 插件以及如何包含它们

ruby-on-rails - 如何将部分字符串与数据库对象的属性相匹配?正则表达式?

c - 使用libpq库从PostgreSQL的查询结果中获取(integer[])数组值

javascript - 只允许使用 javascript 输入数字并允许复制和粘贴?

mysql - 在 Ruby on Rails Windows 7 64x 上安装 Mysql gem