我的控制器中有一些不能正常工作的东西。
我的控制器
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
debug&lt;%= debug @building%&gt;回来我
[#<Building id: 9, name: "234234", slug: nil>] (as example)
但我想获得有关地板和空间的信息。
有人知道如何解决这个问题?
感谢。
答案 0 :(得分: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>
答案 1 :(得分: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。
我还建议您在寻找有关楼层和空间的信息时,在楼层或空间上开始查询,而不是在建筑物上。
答案 2 :(得分:0)
@neimad,不是您问题的直接答案,但是您可以通过直接在查询中嵌入参数来让自己为SQL injection attacks开放:
即。
@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
参数。
即使我不是恶意的,搜索建筑物名称:Kristian's Building
也会破坏此查询。同样的问题适用于楼层租金最大/最小条件