6

Tamam .. Rails'e yeni geldim ve bunun daha önce sorulmuş olduğunu biliyorum, ancak hala aşağıdaki ortak probleme nasıl yaklaşacağım konusunda kafam karışık. Dernek işe yarayabilirim, ama büyülü bir işe sahip olmak ve kötü alışkanlıklarla rayları başlatmak benim yapmak istediğim bir şey değildir.Rails Modeller Oluşturma, has_many ve belongs_to için

Blog yapıyorum diyorum. İki kaynağım var: Makaleler ve Kullanıcılar. Her kullanıcı çok sayıda makalesi bulunmaktadır ve her makalenin tek bir kullanıcıya ait:

rails g scaffold User name:string email:string 
rails g scaffold Article user_id:integer title:string content:string 

Kullanıcı Modeli:

class User < ActiveRecord::Base 
    has_many :articles 
end 

Madde Model:

class Article < ActiveRecord::Base 
    belongs_to :user 
end 

Şimdi benim makaleleri endeksi, yapabilirim gibi bir şey yapın:

…table headers... 
<% @articles.each do |article| %> 
    <tr> 
    <td><%= article.user.name %></td> 
    <td><%= article.title %></td> 
    <td><%= article.desc %></td> 
    <td><%= article.content %></td> 
    <td><%= link_to 'Show', article %></td> 
    <td><%= link_to 'Edit', edit_article_path(article) %></td> 
    <td><%= link_to 'Destroy', article, confirm: 'Are you sure?', method: :delete %></td> 
    </tr> 
<% end %> 
</table> 

Ve Kullanıcı Adı için bu model ilişkilendirmesi için gereken tek şey, response_to'dan önceki indeks eylemine "@ articles = Article.all" yazılmasıdır. Oldukça havalı!

Tüm bu makaleleri (sadeliği için sayfa sırasını burada görüntüleyemiyorum) Giriş sayfamdaki dizin eylemini kullanarak eklemek istiyorum?

class HomeController < ApplicationController 
    def index 
    @articles = Article.joins(:user) 
    end 
end 

... sonra benim ev-> indeks görünümünde bu verilere erişebilir:

Ben Ev Kontrolörü böyle bir şey yapabileceğini biliyorum

<div class="row"> 
    <% @articles.each do |article| %> 
    <div> 
     <h3><%= link_to article.title, 
     :controller => "articles", :action => "show", :id => article.id %></h3> 
     <small>Posted on <%= article.created_at %> by 
     <a href="#"><%= article.user.name %></a></small> 
    </div> 
    <% end %> 
</div> 

İlk Soru : Tüm Makaleler için Kullanıcı verilerine erişirken, şunu kullanmalıyım: birleşim veya bir: içerir? Her ikisi de işe yarayacak gibi görünüyor, ama bu durumda hangisinin doğru olduğunu ve hangisinin genellikle daha hızlı performans gösterdiğini merak ediyorum.

rakip olduğunu-

@articles = Article.includes(:user) 

İkinci Soru

@articles = Article.joins(:user) 
: tamsayı veya kullanıcıyı:
Madde (göçünü bina) benim iskele, ben user_id kullanması gereken referansları. Aynı şeyi yapıyorlar mı yoksa diğerinin üzerinde mi tercih ediyorlar? Kullanırsam: alan türü olarak tamsayı, bunun için bir dizin eklemem önerilir (add_index: articles,: user_id)? Harika bir RailsCast buldum ve açıklamak için harika bir iş çıkardı, ama başka birinin başka bir fikri olup olmadığını merak ediyorum.

Eğer yardımcı olursa, Rails 3.2.2'deyim.

Teşekkürler!

cevap

3

İlk soru: Sen etkili bir şekilde onların kullanıcıların verileri ile tüm makaleleri almak isteyen

, kullanmak gerekir

@articles = Article.includes(:user) 

DB'nizdeki tüm makalelerin listesini alırsınız, her makale kullanıcı ile zaten getirilmiş.

@articles = Article.joins(:user) ile yalnızca bir Kullanıcıya sahip olan makaleleri alırsınız ve bu makalelerin herhangi birinde article.user'u ne zaman yapacağınız, yeni bir SQL talebi oluşturur.

Daha fazla bilgi için: http://guides.rubyonrails.org/active_record_querying.html (Bu kılavuz kümesini henüz okumadıysanız, şimdi bunu yapmanızı kesinlikle öneririz).

İkinci soru:

Ben user_id:integer formu kullanın. user:references'un rails g scaffold komut satırında kullanılabileceğinden emin değilim. 'Article.user_id' sütunundaki bir indeks, belirli bir kullanıcının makalelerini ararken almanın hızını artıracaktır. Bu dizini yalnızca uygulamanız bu tür bir arama yapacaksa ekleyin.

+0

Açıklama için teşekkürler. Günlüklerden, DB'ime iletilen sorguyu görebiliyorum, ancak Rails'in 'katılma' ya da 'katılmalarına' nasıl davrandığından emin değildim. 'Index' cevabı da çok faydalı! – JohnnyCoder

5
  1. Sen kayıtları alınmaya @articles = Article.all :include => :user kullanıyor olmalıdır. Bunun genellikle :joins'dan daha hızlı olduğuna dair daha fazla bilgi için lütfen Rails :include vs. :joins'u okuyun. (Temel olarak, size çiftler olmadan aynı bilgiyi verir.

  2. Rails, geçişler söz konusu olduğunda belongs_to ilişkilendirmeleri için kısayollara sahiptir. belongs_to :user kullanın ve Raylar sizin için otomatik olarak user_id sütununu (integer türünde) içerir.

Örnek:

class CreateArticle < ActiveRecord::Migration 
    def self.up 
    create_table :articles do |t| 
     t.belongs_to :user # Creates 'user_id' column 
     t.timestamps 
    end 
    end 
end 
+0

Teşekkürler! Göçmenler için 'kısaca' diye bir şey bilmiyordum, bunu kesinlikle benim cephanemize eklemem gerekecek. – JohnnyCoder