2011-09-15 185 views
0

我有東西不能像我想在我的控制器中工作。導軌3控制器選擇模型

我控制器

if params[:commit] 
    @search = Building.select('buildings.id, buildings.slug, floors.id, spaces.id, buildings.name, floors.floor_number, spaces.space_number').joins('INNER JOIN floors ON floors.building_id = buildings.id INNER JOIN spaces ON spaces.floor_id = floors.id') 
    @search = @search.where("buildings.name like '%#{params[:building_name]}%'") if !params[:building_name].blank? 
    #@search = @search.where("buildings.name like ?", params[:building_name]) if !params[:building_name].blank? 
    if params[:space_type].present? 
    @search = @search.where("spaces.space_type_id = ?", params[:space_type][:space_type_id]) if !params[:space_type][:space_type_id].blank? 
    end 
    @search = @search.where("floors.min_net_rent >= #{params[:floor_min_rent]}") if !params[:floor_min_rent].blank? 
    @search = @search.where("floors.max_net_rent <= #{params[:floor_max_rent]}") if !params[:floor_max_rent].blank? 

    @building = @search 
else 
    @building = '' 

end 

我的模型

class Building < ActiveRecord::Base 

    has_many :floors 

end 


class Floor < ActiveRecord::Base 

    belongs_to :building 
    has_many :space 

end 

class Space < ActiveRecord::Base 
    belongs_to :floor 
end 

調試<%=調試@building%>返回我

[#<Building id: 9, name: "234234", slug: nil>] (as example) 

,但我想獲得有關地板的信息和空間。

有人有一個想法如何解決這個問題?

謝謝。

+0

如果您調試/打印'@ building.floors'和'@ building.spaces',會發生什麼?它在'rails console'中工作嗎?也有點困惑爲什麼你繼續分配給@搜索變量;你能一次只搜索一個標準嗎?在客戶端執行? –

回答

0

嘗試使用[]

例如

@orders = Order.select("orders.*, cities.name AS city_name, countries.name AS country_name, customers.account_id as customer_acc"). 
     joins("LEFT JOIN customers ON customers.id = orders.customer_id"). 
     joins("LEFT JOIN cities ON orders.city_id = cities.id"). 
     joins("LEFT JOIN countries ON cities.country_id = countries.id") 
鑑於

<tbody> 
    <% @orders.each do |order| %> 
     <tr class=""> 
      <td><%= order[:country_name] %></td> 
      <td><%= order[:city_name] %></td> 
     <td><%= order.type_code %></td> 
      <td><%= order[:customer_acc] %></td> 
     <td><%= order.detail %></td> 
     <td><%= order.number %></td> 
      <td><%= order.expire_date %></td> 
     <td><%= order.status %></td> 
     </tr> 
    <% end %> 
    </tbody> 
+0

我不明白。選擇使用模型? – neimad

+0

yeap它使用模型,但選擇數據與別名從其他表 – Fivell

+0

謝謝,但沒有奏效。如果我在選擇中使用別名,我會得到一個未定義的方法,而我的調試只給出了來自建築物的三個元素。 – neimad

0
當您使用的select(), only attributes belonging to your model will be accessible through your record object

。然後,您必須使用像@ building.floors,@ floor.building ...這樣的關聯來處理數據。仔細查看the association methods that ActiveRecord creates

我還建議,因爲你正在尋找樓層和空間的信息,開始你的查詢樓層或空間,而不是建築。

+0

retrived我已經閱讀你的鏈接,但我不明白你說什麼。如果我需要所有信息,我需要先拿到最後一個?像Space.Floor.Building.select()? – neimad

+0

當您執行類似Building.find(1)的操作時,ActiveRecord會創建一個Building對象的新實例,該實例的屬性被設置爲與基礎查詢的結果相匹配。如果您的查詢返回了一些ActiveRecord無法識別爲Building對象的「普通」屬性的字段,它只是忽略它們。 AR爲與模型相關的表上的每個列自動創建屬性訪問器,以及訪問與單個記錄相關的其他表中的記錄的各種方法。 –

+0

...這意味着你無法一次獲得所有信息,塞入一個獨特的對象。如果你有一個建築物列表,並且你想收集他們樓層的信息,你必須使用像'@a_particular_building.floors.collect&:min_net_rent'這樣的關聯方法。對不起,但我似乎無法讓自己清楚,我認爲最適合你的是確保你真正理解聯合會指南上的內容。 –

0

@neimad,不是直接回答你的問題,但你要離開自己開放SQL injection attacks在查詢中直接嵌入您的PARAMS:

@search = @search.where("buildings.name like '%#{params[:building_name]}%'") if !params[:building_name].blank? 

是脆弱的,如果我設置params[:building_name]到惡意的東西。

,另一方面利用

@search = @search.where("buildings.name like ?", "%#{params[:building_name]}%") if !params[:building_name].blank? 

,將正確逃不過你的build_name PARAM。

即使我不是惡意的,搜索建築名稱:Kristian's Building將打破此查詢。同樣的問題適用於樓層租金最高/最低條件

+0

哦,好的,謝謝!我會做這個改變。 – neimad