2013-02-22 3 views
0

У меня есть приложение Ruby on Rails, которое использует rails_admin (https://github.com/sferik/rails_admin) в качестве бэкэнд.Ограничение количества строк таблицы в rails_admin

У меня есть модель под названием banner, поэтому таблица в базе данных называется баннерами. Администратор может создавать как можно больше баннеров, а также удалять их. Но я хочу исправить количество баннеров в 3. Я хочу иметь 3 баннера (уже созданные), и я хочу, чтобы администратор не мог создавать и уничтожать любые баннеры.

Не мог бы кто-нибудь мне помочь?

Спасибо!

ответ

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 < <, вы гарантированно, что любая вещь всегда будет иметь три баннеров.

0

Validations к спасению:

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 
0

@RadBrad делает точку, что вы могли бы использовать has_many на другую модель, которая представляет собой набор из трех баннеров. Возможно, он мог бы назвать BannerSet или аналогичным. Вы могли бы либо создать три сразу, как он сказал, либо в валидации BannerSet, вы можете убедиться, что есть только 3 связанных баннера.

Вы также можете иметь даже 3 атрибута (столбцы) на модели BannerSet, которые будут иметь 3 идентификатора баннеров. Если вы уверены, что это всегда будет 3 баннера, то это может быть прекрасный дизайн.

Но вот как вы это сделаете, если бы у вас был только контроллер для Banner, который не будет лучшим способом, как вы увидите.

Во-первых, вы могли бы использовать 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, если вам нужно много больше настроек.

Смежные вопросы