2010-06-03 3 views
0
나는 문제 (내가 올바른 생각하는) 내 레일 모델의 정확한 정보 내 테이블의 스키마에 액세스하는 데

있습니다레일 협회 쿼리

create_table :schools do |t| 
    t.string :name 
    t.timestamps 
end 

create_table :variables do |t| 
    t.string :name 
    t.string :category 
    t.timestamps 
end 

create_table :data do |t| 
    t.string :entry 
    t.decimal :rank, :scale => 3 
    t.integer :school_id, :null => false 
    t.integer :variable_id, :null => false 
    t.timestamps 
end 

모델 클래스 : 여기

class Datum < ActiveRecord::Base 
    belongs_to :school 
    belongs_to :variable 
end 

class School < ActiveRecord::Base 
    has_many :data 
    has_many :variables, :through => :data 
end 

class Variable < ActiveRecord::Base 
    has_many :data 
    has_many :schools, :through => :data 
end 

내 학교 show.html.erb 페이지는 현재 :

<h2> <%= @school.name %> </h2> 

<table> 
<% @school.variables.each do |variable| %> 
<tr><tr/> 
<td><%= variable.name %></td> 
<td><%= Datum.find(:first, :conditions => {:school_id => @school.id, :variable_id => variable.id}).entry %></td> 
<td><%= link_to 'Edit', edit_school_path(@school) %></td> 
<td><%= link_to 'Back', schools_path %></td> 
<% end %> 
</table> 

그것은 내가 원하는 것이지만 많은 queri es. 나는 열심히 선적해야한다고 가정하고 있지만, 온라인에서 찾은 예제를 기반으로이 작업을 수행하는 방법을 알 수 없었습니다 (저는 레일이 처음이었습니다). 누구든지 아이디어가 있습니까?

답변

2

예상되는 결과와 더 적은 수의 쿼리가 표시되는지 확인하십시오.

Datum.find(:first, 
      :conditions => {:school_id => @school.id, :variable_id => variable.id}, 
      :include => [:school, :variable]) 

또한 MVC 원칙에 따라 사용자가보기에서 찾기를 수행해서는 안됩니다.

@data = Datum.find(....) 

및 뷰 대신 컨트롤러의 방법 (응용 프로그램/컨트롤러/school_controller.rb, 방법 쇼)을 수행합니다

<%= @data.entry %> 

당신은 DB 접속보기를 오염시키지 않는 방법 우려.

0

글쎄 루프 내에서 Datum.find 쿼리를 수행하고 있습니다. 레일스는 @ school.variables에 의해 반환되는 각 요소에 대해이를 수행 할 것입니다.

Find 문이 컨트롤러에서 실제로 수행되어야합니다. 열망하는로드를 사용하여 하나 또는 두 개의 신중하게 만들어진 검색을 사용하여 필요한 변수를 설정하십시오. 그런 부분 ('_variable'와 같은 이름 일)로 각 루프에서 HTML 물건을 넣고 같은보기에 호출 : 당신의 이름의 이름을 따서 명명 지역 변수를 얻는 부분 내부

<% render :partial 'variable', :collection => @school.variables %> 

컬렉션에있는 현재 구성원의 데이터가 부분적입니다. Rails가 루핑을 처리합니다.

도움이 되었기를 바랍니다.