2014-10-06 2 views
0

У меня есть простая форма для отображения модели с отношениями has_many.Filtered has_many relationship form

form do |f| 

    f.semantic_errors *f.object.errors.keys 

    f.inputs do 
     f.has_many :messages, allow_destroy: true, heading: 'Messages' do |f| 
     f.input :title 

     end 
    end 

    f.actions 
    end 

Мой вопрос: как предварительно фильтровать: сообщения пока не будут показаны? Это зависит от пользователя current_admin.

+0

Является ли модель AdminUser, которая имеет много сообщений? – nistvan

+0

Нет, это не так. Это имеет значение? – NeverBe

ответ

1

NeverBe!

Мое решение основано на создании пользовательского отношения has_many с условием для модели. Например:

Файл /app/models/key.rb

class Key < ActiveRecord::Base 

    attr_accessible :name, 
        :messages, :messages_attributes, 
        :messages_for_organization_attributes 

    has_many :messages, dependent: :destroy 
    accepts_nested_attributes_for :messages, allow_destroy: true 

    has_many :messages_for_organization, class_name: 'Message', conditions: proc {"organization_id" = #{$current_admin_user.organization_id}"} 
    accepts_nested_attributes_for :messages_for_organization, allow_destroy: true 

end 

/app/models/message.rb Файл

class Message < ActiveRecord::Base 

    attr_accessible :title, 
        :key, :key_id 
        :organization, :organization_id 

    belongs_to :key 
    belongs_to :organization 

end 

приложение File/администратор/key.rb:

controller do 

    def edit 
     if current_admin_user.role?('super_admin') 
     @key = Key.find_by_id(params[:id]) 
     else 
     @key = Key.joins('LEFT JOIN messages ON messages.key_id = key.id').where(id: params[:id]).first 
     end 
     $current_admin_user = current_admin_user # Important assignment to get access current_admin_user in Key model class 

     edit! 
    end 

end 


form do |f| 
    f.semantic_errors *f.object.errors.keys 

    f.inputs do 
     if current_admin_user.role?('super_admin') 
      f.has_many :messages, allow_destroy: true, heading: 'Messages' do |f| 
       f.input :title 
      end 
     else 
      f.has_many :messages_for_organization, allow_destroy: true, heading: 'Messages' do |f| 
       f.input :title 
      end 
     end 
    end 

    f.actions 
end 
Смежные вопросы