限制rails_admin中表的行数

时间:2013-02-22 16:46:15

标签: ruby-on-rails ruby rails-admin

我有一个Ruby on Rails应用程序,它使用rails_admin(https://github.com/sferik/rails_admin)作为后端。

我有一个名为banner的模型,所以数据库中的表名为banners。管理员可以尽可能多地创建横幅,也可以删除它们。但我想修复3中的横幅数量。我希望有3个横幅(已经创建),我希望管理员无法创建或销毁任何横幅。

有人可以帮助我吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

 class Thing < ActiveRecord::Base
   has_many :banners
 end

应用程序/控制器/ things_controller.rb

 def create
   @thing = Thing.new
   @thing.banners << Banner.new(:name=>'Banner 1',....)
   @thing.banners << Banner.new(:name=>'Banner 2',....)
   @thing.banners << Banner.new(:name=>'Banner 3',....)
   @thing.save
 end

现在只要你在别的地方打电话给@ thing.banners&lt;&lt; ,你可以保证任何东西都会有三个横幅。

答案 1 :(得分:0)

救援的验证:

class Thing < Active Record::Base
  has_many :banners

  validate :banner_count

  private
    def banner_count
      errors.add(:base, "Banner count must be 3") unless self.banners.count == 3
    end
end

答案 2 :(得分:0)

@RadBrad指出,您可以在代表三个横幅的另一个模型上使用has_many。也许可以称之为BannerSet或类似。您可以像他说的那样一次创建三个,或者在BannerSet验证中,您可以确保只关联了3个横幅。

您还可以在BannerSet模型上拥有3个属性(列),这些属性具有横幅的3个ID。如果你确定它总是3个横幅,那么这也可能是一个很好的设计。

但是,如果你只有一个控制器用于横幅广告,这就是你如何做到的,这不是最好的方式,正如你所看到的那样。

首先,您可以在控制器中使用declarative authorization

authorization do
  has_permission_on :banners, :to => [:new, :create] do
    Banner.count < 3
  end
end

要确保即使在您进入创建屏幕后添加横幅广告时仍无法添加横幅,也请为横幅模型添加验证:

before_create :validate_max_banners

def validate_max_banners
  errors.add_to_base("Only 3 banners are allowed.") if Banner.count == 3
  errors.empty?
end

两者都不能完全确保您在该表中只能有3行。要做到这一点,您需要在数据库端使用触发器或类似功能,如this q&a中所述。但是,对于一个基本的解决方案,这可能没问题。

请注意,即使可以轻松配置和自定义RailsAdmin(请参阅其wiki了解文档),如果您需要更多自定义,我还会考虑使用ActiveAdmin