使用作用域验证值的唯一性 - Ruby on Rails 5

时间:2018-01-15 16:10:30

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2

我的表posts包含模型Post和表格语言(columns-id,post_id,language),模型为Language。 Post有很多语言,语言属于Post。在帖子模型中我有:

发布模型:

has_many :languages
validates_associated :languages

语言模型:

belongs_to :post
validates_uniqueness_of :language, scope: :post_id

language是表语言中的列。

posts_controller中允许使用语言字段(强参数):

def post_params
    params.require(:post).permit(:languages_attributes => [:language], ...)

这是创建帖子的表单视图:

<%= form_for @post do |f| %>
    .....
    <%= f.fields_for :languages do |language| %>
        <%=language.select :language, ['english', 'italian', 'french', 'spanish'], name: 'post[languages_attributes][][language]' %>
        <%=language.select :language, ['english', 'italian', 'french', 'spanish'], name: 'post[languages_attributes][][language]' %>
        <%=language.select :language, ['english', 'italian', 'french', 'spanish'], name: 'post[languages_attributes][][language]' %>
        <%=language.select :language, ['english', 'italian', 'french', 'spanish'], name: 'post[languages_attributes][][language]' %>
    <% end %>

这是创建帖子方法:

@post= Post.new(post_params)
if @post.save
....

我想验证具有帖子范围(范围:: post_id)的语言的唯一性,并且每个帖子只有1个英语语言用于示例。该帖子可以有多种语言,但语言不同。

我尝试使用validates_uniqueness_of :language, scope: :post_id,但如果我添加两次英语(全部小写),则没有错误,并且数据会插入到表中。

如何使用当前帖子的范围验证帖子的语言的唯一性?

编辑:我发现这是Rails中的一个错误 - GitHub,但我仍然需要一个解决方案。

2 个答案:

答案 0 :(得分:6)

如何验证Rails 5中两列的唯一性? 这就是答案

validates :username, uniqueness: { scope: :group_id }

如果您需要记录是唯一的,请向记录添加唯一索引

class AddUniqueIndexToRoles < ActiveRecord::Migration[5.2]
  def change
    add_index :roles, [:username, :group_id], unique: true
  end
end

答案 1 :(得分:2)

我完全不了解您的问题,但如果您无法通过以下

验证唯一性
validates_uniqueness_of :language, scope: :post_id

然后你可以尝试类似下面的内容

validates :validate_language_id


def validate_language_id
  if post.languages.where(language: self.language).exist?
     error.add(:language_id, 'has already been taken')
  end
end

我希望这对你有用......