0

データベース内の 2 つの異なるテーブルから取得した値をビュー ページのテーブルに出力したいと考えています。異常な動作をしている、つまり値を数回出力しているため、各イテレータを 2 つ処理する方法がわかりません。私はとても混乱しています。助けてください。

これが私のコードです

コントローラーで:

class ListController < ApplicationController

  def all
    @books = Book.all   
    @susers = SUser.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>    

        <% @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>

出力はこのように表示されます

else最初のステートメントの部分は、ifそれ自体を何度も繰り返しています。なぜそれが起こっているのかわからないのですか?book テーブルにはデータベースに 4 つの本があるため、エラー部分が 4 回印刷されていることがわかります。

このプロジェクトには 3 つのモデルがあります。1. User - devise 製 2. Book 3. SUser

重要なことの 1 つ: - 実際に SUser モデルを作成したのは、名前、住所、電話番号などのユーザーの個人情報を保存したいからです。デバイスモデル(ユーザー)に触れたくないので、デバイスモデル(ユーザー)と1対1の関係を持つ別のモデルSUserを作成しました。

ユーザーモデル:

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

本のモデル:

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

SUser モデル:

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

移行ファイル:

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

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

1 人のユーザーが多くの本を持っていて、1 つの本を多くのユーザーが利用できるため、ユーザーと本の間に多対多の関係を作りました。だから私は多対多の関連付けのための単純な結合テーブルを作りました

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 ..コード全体をここに貼り付けました。実際、私はレールに慣れていません。このコードに他の欠陥が見つかった場合は、私を案内してください。ありがとう

4

2 に答える 2

1

モデル間の関係を定義できます。one to many関係タイプは状況に適していると思います。

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

class SUser < ActiveRecord::Base
  has_many :books
end

次に、コントローラーで次のように記述できます。

class ListController < ApplicationController
  def all
   @books = Book.includes(:suser).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.try(:address) %></td>
  </tr>   
  <%else%>
    <% puts "No any book of this branch"%>  
  <%end%>                                     
<%end%>                                 
</tbody>

PSelse :各ユーザーをチェックするため、ブロックを繰り返すのが普通ですbook.suser_id == suser_id(ただし、本とsuserの間には1対多の関係があるため、本は1人のユーザーにのみ属し、多対多の関係がある場合は少数になります)

于 2012-10-25T20:56:38.923 に答える
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>

最後に、次のようなリレーションシップの外部キーが必要になります。

script/generate migration add_user_id_to_books

移行構文は扱いにくい場合があるため、移行ファイル (db/migrate 内) を開き、add_column :books, user_id, integer と同様の処理を行っていることを確認してください。

于 2012-10-25T20:59:28.883 に答える