2015-06-03 95 views
0

我很新的軌道。我正在學習如何將數據庫查詢傳遞給json以在視圖中呈現它們。顯示數據庫表中的所有記錄,而不是單個記錄

我想執行一個簡單的表查詢(表稱爲username:stringid:integer),其在所述模型中進行,並傳遞給控制器​​,然後到index.json.jbuilderindex.html.erb.

的問題是,當我請

blabla/index.json我得到一個空數組,但是當我打電話blabla/1.json,我得到的用戶1的數據,但我希望得到所有用戶。

我知道有更簡單的方法來做到這一點,但這是我想如何做到這一點。我如何避免傳遞user_id來獲取記錄?

user.rb

class User < ActiveRecord::Base 

def self.feed 
"SELECT * FROM User" 
end 
end 

users_controller.rb

def index 
    @users = User.feed 
    end 

index.json.jbuilder

json.extract! @user, :id, :name, :created_at, :updated_at 

index.html.erb

<p id="notice"><%= notice %></p> 
<h1>Listing Users</h1> 
<table> 
    <thead> 
    <tr> 
     <th>Name</th> 
     <th colspan="3"></th> 
    </tr> 
    </thead> 
    <tbody> 
    <% @users.each do |user| %> 
     <tr> 
     <td><%= user.name %></td> 
     <td><%= link_to 'Show', user %></td> 
     <td><%= link_to 'Edit', edit_user_path(user) %></td> 
     <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 
<br> 
<%= link_to 'New User', new_user_path %> 
+0

只是聲明一個變量傳遞給json。這是不正確的? –

+0

你的索引方法在哪裏? –

+0

控制器顯示是一個錯字。現在糾正了。同樣的問題,雖然 –

回答

2
def index 
    @users = User.get_all 
    respond_to do |format| 
    format.json {render json: @users} 
    end 
end 

在user.rb

def self.get_all 
    User.all 
end 
+0

它適合你嗎? –

+0

@Sebastian Zeki,你的'User.feed'方法只是返回字符串''SELECT * FROM User'' - 它不以任何方式評估實際的數據庫查詢。 @ user123寫的'User.all'就是讀取整個'users'表,然後'render json:@ users'將它作爲JSON返回給瀏覽器。查看[ActiveRecord基礎知識](http://guides.rubyonrails.org/active_record_basics.html) –

+0

謝謝,但特別想要一個基於模型的答案,根據原始問題。我試圖弄清楚模型如何與控制器進行通信,以便我可以從模型查詢中獲得所有結果 –

0

您可以使用user123的答案,而且也應該,因爲ORM能夠成爲超強當ACL寶石捆綁,緩存等等。但是,如果你需要,你也可以寫更復雜的查詢。這是通過使用緯度的距離和經度更復雜的選擇用戶的一個例子的scope(你也可以在函數中使用):

scope :near, -> (lat, lng, distance) { 
    origin_lat = lat/180 * Math::PI 
    origin_lng = lng/180 * Math::PI 

    select("users.*") 
    .select("(ACOS(COS(%{lat})*COS(%{lng})*COS(RADIANS(users.latitude))*COS(RADIANS(users.longitude))+ 
     COS(%{lat})*SIN(%{lng})*COS(RADIANS(users.latitude))*SIN(RADIANS(users.longitude))+ 
     SIN(%{lat})*SIN(RADIANS(users.latitude)))*3963) AS distance" % [ lat: origin_lat, lng: origin_lng, distance: distance ]) 
    .where(["(ACOS(COS(:lat)*COS(:lng)*COS(RADIANS(users.latitude))*COS(RADIANS(users.longitude))+ 
     COS(:lat)*SIN(:lng)*COS(RADIANS(users.latitude))*SIN(RADIANS(users.longitude))+ 
     SIN(:lat)*SIN(RADIANS(users.latitude)))*3963) <= :distance", lat: origin_lat, lng: origin_lng, distance: distance]) 
    .order('distance DESC') 
} 

在那裏你會再這樣稱呼它User.near(lat, lng, distance),它會返回所有的在一定距離內的實例。

當涉及到它時,它只是知道將字符串放在Rails的query builder內的哪個位置。

相關問題