【问题标题】:Has_and_belongs_to_many find if existsHas_and_belongs_to_many 查找是否存在
【发布时间】:2014-01-20 01:20:03
【问题描述】:

我在两个表之间有 has_and_belongs_to_many 关系:usersroles

当我添加到联接表时,如何防止重复,这样同一角色中的同一用户就不能被添加两次(例如检查该行是否已经存在)。我知道有一个find 函数,但我认为这不是我要找的。任何帮助将不胜感激。

role = Role.find(params[:role_id])
user = User.find(params[:user_id])
role.users << user

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    在您的 habtm 声明中添加 uniq: true 检查会有所帮助 - 它会忽略连接表中已经存在的重复项:

    class Role < ActiveRecord::Base
      has_and_belongs_to_many :users, :uniq => true
    end
    

    如果您想首先将重复项排除在连接表之外,则必须将连接表升级为一流的连接模型(并使用 has_many-through 而不是 habtm)声明 validate_uniqueness_of,或者您可以坚持使用 habtm 并提供自定义验证回调:

    class Role < ActiveRecord::Base
      has_and_belongs_to_many :users, :before_add => :validate_not_duplicate
    
      private
    
      def validate_not_duplicate(user)
        raise 'some error' if users.include? user
      end
    end
    

    不幸的是,设置错误标志或返回false 不会阻止模型被添加到连接表中——您需要引发某种异常。也许这将是一些人远离 habtm 的一个很好的激励......

    【讨论】:

    • 这很完美,但有没有办法使用flash 提醒用户它已经存在?
    • @evanvee - 对此进行了更新,您需要捕获任何抛出的错误以确定是否发生这种情况。要么使用habtm。
    • 这是完美的。谢谢!
    猜你喜欢
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2016-09-05
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多