【问题标题】:Validate uniqueness of a value with scope - Ruby on Rails 5使用范围验证值的唯一性 - Ruby on Rails 5
【发布时间】:2018-06-24 07:18:10
【问题描述】:

我有表 posts 和模型 Post 和表语言(列 - id、post_id、语言)和模型 Language。 Post 有多种语言,Language 属于一个 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 次英语作为示例。帖子可以有超过 1 种语言,但语言不同。

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

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

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

【问题讨论】:

  • 请告诉您要验证语言表中的哪一列在您的语言模型中的唯一性。我不认为它被称为语言
  • 它被称为language
  • 这能回答你的问题吗? Validate uniqueness of multiple columns

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


【解决方案1】:

如何在 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

【讨论】:

    【解决方案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
    

    我希望这对你有用...

    【讨论】:

    • *** NoMethodError Exception: undefined method languages' for #<0x12fb4c78>
    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多