2016-04-07 15 views
0

Here is the live demoGörünümde SQL yazmadan aynı tablodaki koşulları nasıl gösterebilirim?

Tablolar:

|perfils| 
    |id| |name| 
    1  Administrator 
    2  Admin for products 

|grants| 
    |id| |parent_id| |name| 
    1  0  Module Clients #parent 
    2  1   Show Client ###child from Module Clients 
    3  1   New Client ###child = Module Clients 
    4  1   Edit Client ###child = Module Clients 
    5  0  Module Products #parent 
    6  5   Show Product ###child = Module Products 
    7  5   New Product ###child = Module Products 

|perfil_accesses| 
    |id| |grant_id| |perfil_id| 
    1  1   1 
    2  2   1 
    3  3   1 

Kontrolör perfil_controller.rb:

def new 
    @perfil.new 
    @grants = Grant.where(parent_id: 0) 
end 

def create 
    @perfil = Perfil.new(perfil_params) 
    if @perfil.save 
    @accesses.each do |access| 
     if params["access_"+access.id.to_s] == "on" 
     perfil_access = Grant.new() 
     perfil_access.access_id = access.id 
     perfil_access.perfil_id = @perfil.id 
     perfil_access.save 
     end 
    end 

    redirect_to perfils_path 
    else 
    render :new 
    end 
end 

Modelleri

#Perfil.rb 
    has_many :perfil_accesses 

#PerfilAccess.rb 
    belongs_to :grant 
    belongs_to :perfil 
ebeveynlerden görünümünde SQL metni yazmadan childs satırları göstermek için bir çözüm var mı: Sorun

Burada Görünüm new.html.erb

<script src="https://code.jquery.com/jquery-2.2.1.js"></script> 

<script> 
$(document).on('change', '.parentCheckBox', function() { 
    var that = $(this); 
    that.closest('div').find('.childCheckBox').prop('checked', that.is(':checked')); 
$(this).val($(this).prop('checked')?1:0); 
}); 

$(document).on('change', '.childCheckBox', function() { 
    var that = $(this); 
    var par = that.closest('ul'); 
    var c = par.find('.childCheckBox').filter(':checked').length; 
    var parChk = par.closest('div').parent().find('.parentCheckBox'); 
    var checked = c > 0; 

    $(this).val($(this).prop('checked')?1:0); 
    parChk.prop('checked', checked); 
    console.log(checked); 
}); 
</script> 


<%= form_for(@perfil) do |f| %> 
<%= f.label :name %><br> 
<%= f.text_field :name %> 

<% @grants.each do |access| %> 
<div> 
    <input type="checkbox" class="parentCheckBox" /> <%= grant.name %> 
    <a onclick="document.getElementById('div_<%= access.id %>').style.display='';return false;"><img src="https://cdn0.iconfinder.com/data/icons/ie_Bright/512/plus_add_green.png" height="20" width="20"></a> 
    <a onclick="document.getElementById('div_<%= access.id %>').style.display='none';return false;"><img src="https://cdn0.iconfinder.com/data/icons/ie_Bright/512/minus_remove_green.png" height="20" width="20"></a> 
    <br/> 

    <div id="div_<%= access.id %>" style="display:none;"> 
    <ul> 
    <% Grant.where(parent_id: access.id).each do |grant|%> 
     <li><input id="access_<%= grant.id %>" name="access_<%= grant.id %>" type="checkbox" class="childCheckBox" /><%= grant.name %></li> 
    <% end %> 
    </ul> 
    </div> 
</div>  
<% end %> 

<%= f.submit %> 
<% end %> 

mı?

<% Grant.where(parent_id: access.id).each do |grant|%> 
    <li><input id="access_<%= grant.id %>" name="access_<%= grant.id %>" type="checkbox" class="childCheckBox" /><%= grant.name %></li> 
<% end %> 

Denedim:

#CONTROLLER 
    @grants = [] 
    @accesses.each do |access| 
    @grants << Access.where(parent_id: access.id) 
    end 

#VIEW 
<% @accesses.each do |access| %> 
    <%= access.name %> 

    <% access.where(parent_id: access.id).each do |grant| 
    <ul> 
     <li><%= grant.name %></li> 
    </ul> 
<% end %> 
+0

tuttuğunu belirttiniz. Bağışlarla ilgili bir bağlantınız var mı? – trh

+0

evet bunu aldım, yazıyı güncelledim ve modelleri yazdım. –

+0

İlişkilendirmeden aynı tablodan bir sorgu yapıyorum. –

cevap

1

Kumandanızda size @grants ekleme yerine yuvalanmış değişkeni yapıyoruz. Bunu ele almanın en iyi yolu, hibeleri erişim ile ilişkilendiren bir karma oluşturmaktır.

<% @accesses.each do |access| %> 
    <%= access[:parent].id %> 
    <% access[:children].each do |grant| 
    <%= grant.id %> 

için: görünümünde

@accesses[0] = { parent: Grant.where(parent_id: 0).first, 
       children: Grant.where(parent_id: Grant.where(parent_id:0).first.id } 

böyle kullanılabilir: böylece

@accesses.each do |access| 
    @grants << Access.where(parent_id: access.id) 
end 

@accesses değişken iç içe bir karma çocuklara ilişkin ebeveyn içermesi gerekir Bunu denetleyicide çalışması için aşağıdaki sorgu kullanılır:

@accesses = Grant.where(parent_id: 0).map do |access| 
    { parent: access, children: Grant.where(parent_id: access.id) } 

Hibe tablosunun ebeveynleri (erişim) ve çocukları (hibeler)

+0

Fantastik. Bu çalıştı ve bu bilgiyi nasıl aldın? veya örnekler? Bunu uygulamaya ihtiyacım var. –