2012-10-25 4 views
0

Je souhaite imprimer les valeurs tirées de deux tables différentes dans la base de données dans une table de la page de vue. Je ne comprends pas comment gérer deux chaque itérateur car il se comporte anormalement i.e Impression d'une valeur plusieurs fois. Je suis très confus. S'il vous plaît aider.Comment gérer chaque itérateur?

Voici mon code

Dans le contrôleur:

class ListController < ApplicationController 

    def all 
    @books = Book.all 
    @susers = SUser.all  
    end 
end 

À mon avis Page

<tbody>      
    <% @books.each do |b| %> 
    <% if b.branch == "I.T" %>          
     <tr> 
     <td><%= b.id %></td> 
     <td><%= b.book_name %></td> 
     <td><%= b.year %></td> 
     <td><%= b.user_id %></td>  

     <% @susers.each do |s| %>     
      <% if s.user_id == b.user_id %> 
      <td><%= s.address %></td> 
      <% else %> 
      <td>Error..!!</td> 
      <% end %> 
     <% end %>      
     </tr> 
    <% else %> 
     <% puts "No any book of this branch" %> 
    <% end %>          
    <% end %>         
</tbody> 

La sortie est affichée comme celui-ci

La else partie de la première if déclaration se répète encore et encore encore. Je ne sais pas pourquoi ça se passe? You can see the error part printing four times since the book table has 4 books in the database.

Il existe 3 modèles dans ce projet. 1. utilisateur - Fait par 2. Livre concevoir 3. SUSER

Une chose importante: - En fait, je fait modèle SUSER parce que je veux stocker les données personnelles de l'utilisateur telles que le nom, l'adresse, numéro de téléphone. Je ne veux pas toucher au modèle (Utilisateur) donc j'ai fait un autre modèle SUser qui a une relation un à un avec le modèle (User).

modèle utilisateur:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    has_and_belongs_to_many :books 
    has_one :s_user 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me 
    # attr_accessible :title, :body 

end 

Modèle livre:

class Book < ActiveRecord::Base 
    # attr_accessible :title, :body 
    has_and_belongs_to_many :users 
    belongs_to :s_user, :class_name => "SUser" 
    attr_accessible :id, :user_id, :book_name, :edition, :author, :branch, :publisher,  :year, :details 
end 

modèle SUSER:

class SUser < ActiveRecord::Base 
    # attr_accessible :title, :body 
    has_one :user 
    has_many :books 
    attr_accessible :user_id, :fullname, :email, :address, :details 
end 

fichiers Migrations:

class CreateBooks < ActiveRecord::Migration 
    def change 
    create_table :books do |t| 
    t.integer "user_id", :limit =>5 
    t.string "book_name", :limit => 50 
    t.integer "edition", :limit => 5 
    t.string "author", :limit => 30 
    t.string "branch", :limit => 30 
    t.string "publisher", :limit => 50 
    t.integer "year", :limit => 10  
    t.text "details" 
    t.timestamps 
    end 
    add_index :books, "user_id" 
end 
end 

fichier de migration SUSER

class CreateSUsers < ActiveRecord::Migration 
def change 
    create_table :s_users do |t| 
    t.integer "user_id", :limit => 5 
    t.string "fullname", :limit => 25    
    t.string "email", :default => "", :null => false 
    t.string "hashed_password", :limit => 40 
    t.string "salt", :limit => 40 
    t.string "address",:limit => 25 
    t.text "details" 
    t.timestamps 
    end 
    add_index :s_users, "user_id" 
end 
end 

Je fait beaucoup à plusieurs entre utilisateur et livre depuis un utilisateur ont beaucoup de livres et un livre peut être disponible pour de nombreux utilisateurs. donc je l'ai fait d'une simple table de jointure pour beaucoup de many

class CreateBooksUsersJoin < ActiveRecord::Migration 
def up 
    create_table :books_users, :id => false do |t| 
    t.integer "book_id" 
    t.integer "user_id" 
    end 
    add_index :books_users, ["book_id", "user_id"] 
end 

def down 
    drop_table :book_users 
end 
end 

Lol .. J'ai collé mon code tout ici. En fait, je suis nouveau sur les rails .. S'il vous plaît me guider si vous trouvez un autre défaut à ce code. Merci

Répondre

1

Vous pouvez définir les relations entre vos modèles, je pense que one to many type de relation convient à votre situation:

class Book < ActiveRecord::Base 
    belongs_to :suser, :class_name => "SUser" 
end 

class SUser < ActiveRecord::Base 
    has_many :books 
end 

Ensuite, dans votre contrôleur, vous pouvez écrire comme ceci:

class ListController < ApplicationController 
    def all 
    @books = Book.includes(:suser).all 
    end 
end 

Et enfin votre vue ressemblera à:

<tbody>      
<% @books.each do |b| %> 
    <% if b.branch == "I.T"%>          
    <tr> 
    <td><%= b.id%></td> 
    <td><%= b.book_name%></td> 
    <td><%= b.year%></td> 
    <td><%= b.user_id%></td>  
    <td><%= b.suser.try(:address) %></td> 
    </tr> 
    <%else%> 
    <% puts "No any book of this branch"%> 
    <%end%>          
<%end%>         
</tbody> 

P.S.: il est normal que vous avez répétition de else bloc parce que vous vérifiez pour chaque utilisateur si book.suser_id == suser_id (mais il y a un à plusieurs rapports entre les livres et susers, alors livre appartient à un seul utilisateur, à peu dans le cas où vous avez beaucoup à beaucoup relation)

+0

Il n'affiche pas l'adresse. La colonne est vide. Je pense que les données ne viennent pas à cette partie. –

+0

Ne fonctionne pas .. !! :( –

+0

@ahmadhamza êtes-vous sûr il y a au moins un livre avec aucun nul (ou zéro) 'suser_id' dans votre db? – Serjio

1
class Book < ActiveRecord::Base 
    belongs_to :suser 
end 

class SUser 
    has_many :books 
end 

class ListController < ApplicationController 
    def all 
    @books = Book.includes(:susers).all 
    end 
end 

<tbody>      
<% @books.each do |b| %> 
    <% if b.branch == "I.T"%>          
    <tr> 
    <td><%= b.id%></td> 
    <td><%= b.book_name%></td> 
    <td><%= b.year%></td> 
    <td><%= b.user_id%></td>  
    <td><%= b.suser.address %></td> 
    </tr> 
    <%else%> 
    <% puts "Branch has no books"%> 
    <%end%>          
<%end%>         
</tbody> 

Enfin, vous aurez besoin d'une clé étrangère pour la relation, quelque chose comme:

script/generate migration add_user_id_to_books 

syntaxe de migration peut être difficile si ouvrir le fichier de migration (en db/migration) et assurez-vous qu'il fait quelque chose de similaire à add_column: books, user_id, integ er

+0

hey @junky Merci pour l'aide que j'ai pas essayé..... avant que je veux demander que cette commande 'script/générer la migration add_user_id_to_books' est d'ajouter une colonne ou quoi? –

+0

et si elle est d'ajouter la colonne dans la table de livre, je voudrais ensuite vous dire que j'ai déjà mentionné le 'user_id' dans ma table du livre –

+0

Ne fonctionne pas, il montre une erreur' méthode non définie 'adresse 'pour nil: NilClass' pour le' NoMethodError dans List # all' –