1

我想使用 if 语句来检查 Postgres DB 表中的值是否唯一。如果是独一无二的,那就做点什么,如果不是独一无二的,做点别的。这是 Ruby on Rails 中伪代码的样子。

if validates_uniqueness_of :number == "true"
    puts "this value is unique and should be added to the DB"
else 
    puts "this value is not unique and should not be added to the DB"
end

这种类型的逻辑可以在模型或控制器中实现吗?如果是,哪个是更好的方法?如果不是,我应该怎么做?另外,这样的语法会是什么样子?

多谢你们!

4

4 回答 4

4

你可以使用存在吗?检查记录是否已经在数据库中的方法。它可以采用您要搜索的字段的哈希值:

before_create :do_something_if_unique

def do_something_if_unique
  if self.class.exists?(number: number)
    # there is a record that exists with this number
  else
    # there are no records that exist with this number
  end
end
于 2012-11-16T00:28:35.603 回答
1

为了在列中找到唯一值,我会执行以下操作:

def self.has_unique_numbers?
    pluck(:number).uniq.count == 1
end

然后在您的模型或控制器中,您可以询问:

if YourModel.has_unique_numbers?
    # Some Code
else
    # Some other code
end
于 2012-11-16T00:28:40.790 回答
0

您可以使用first_or_create

MyModel.where(number: number).first_or_create!

如果没有找到与给定条件匹配的内容(也可以链接更多 AR 方法),则将对象保存到数据库中。它是否应该进入模型或控制器取决于您如何使用它。它应该可以正常工作。

于 2012-11-16T00:21:31.953 回答
0

看看:validates_uniqueness_of模型验证。您是否要额外添加数据库约束是一个更大的问题,这取决于您坐在围栏的哪一边:)

class MyThing < ActiveRecord::Base
   validates :number, :uniqueness => true
end

a = MyThing.create(:number => 1) # will succeeed
b = MyThing.create(:number => 2) # will fail and a.errors will contain more info.
于 2012-11-16T00:22:06.747 回答