【问题标题】:RoR permit delete if no associations如果没有关联,则 RoR 允许删除
【发布时间】:2016-03-10 09:51:22
【问题描述】:

有没有办法只允许删除没有关联的记录?

例如,我们可以有roomsevents。由于某种原因,RoomX 不应该再被使用并且可以被删除。

任务:用户无法删除@room,直到validates: @room has no Events

room.rb:

class Room < ActiveRecord::Base
  has_many :events
  def to_s
    name
  end
end

event.rb:

class Event < ActiveRecord::Base
  belongs_to :room
end

您有什么想法/解决方案吗?

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

您可以使用before_destroy 验证并检查是否仍然不存在关联

class Room < ActiveRecord::Base

 before_destroy :check_for_associations

  def events?
    events.any?
  end

  private

  def check_for_associations
    if events?
      errors[:base] << "cannot delete : events are still planned"
      false
    end
  end
end

【讨论】:

    【解决方案2】:

    你没有做太多的事情,但这里有一个非常简单的实现,你可以在视图中使用:

    if room.events.present?
      "You can't delete this"
    else
     link_to room_path(@room), method: :delete
    end
    

    这将处理视图层验证 - 但您还应该在模型中验证这一点,并在数据库层再次验证。

    在您的模型中,您可以添加一个 before_destroy 验证来进行与上述相同的检查。

    before_destroy :check_whether_room_has_events

    def check_whether_room_has_events
      return true if room.events.count == 0
      errors.add(:base, "Cannot delete room with events")
      return false
    end
    

    我相信最后一点是正确的,但没有测试过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多