Ruby on rails rails 3控制器选择型号

Ruby on rails rails 3控制器选择型号,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 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 INNE

我的控制器中有些东西不能正常工作

我的控制器

  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 id: 9, name: "234234", slug: nil>] (as example)
但我想了解有关楼层和空间的信息

有人知道如何解决这个问题吗

谢谢。

尝试使用[]

范例

@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>
使用“选择”时。然后您必须使用诸如@building.floors、@floor.building之类的关联。。。处理数据。仔细看一看


此外,我还建议,当您正在查找有关楼层和空间的信息时,可以从楼层或空间开始查询,而不是从建筑开始查询。

@neimad,这不是对您的问题的直接回答,而是直接将参数嵌入到查询中,让您有机会:

i、 e

如果我将params[:building_name]设置为恶意内容,则易受攻击

使用

@search = @search.where("buildings.name like ?", "%#{params[:building_name]}%") if !params[:building_name].blank?
另一方面,将正确地转义build_name参数


即使我不是恶意的,搜索建筑名称:克里斯蒂安的建筑也会破坏这个查询。同样的问题也适用于楼层租金最大/最小条件

如果调试/打印@building.floors和@building.spaces会发生什么?它在rails控制台中工作吗?还有一点困惑,为什么一直给@search变量赋值;你能一次只搜索一个标准吗?我读过你的链接,但我不明白你说什么。如果我需要所有信息,我需要从最后到第一?类似于Space.Floor.Building.select?当您执行类似于Building.find1的操作时,ActiveRecord将创建一个建筑对象的新实例,该实例的属性设置为与基础查询的结果相匹配。如果查询返回某些ActiveRecord无法识别为建筑对象的常规属性的字段,则只会忽略它们。AR会自动为与模型相关的表上的每一列创建属性访问器,以及从与单个记录相关的其他表中访问记录的各种方法……这意味着您不能一次获得所有信息,而只能填充在一个唯一的对象中。例如,如果您有一个建筑物列表,并且希望收集有关其楼层的信息,则必须使用诸如@a_special_building.floors.collect&:min_net_rent之类的关联方法。对不起,我似乎不能说清楚,我想对你最好的办法是确保你真正理解协会指南上写的内容。我不明白。选择使用模型?是的,它使用模型,但从其他表中选择具有别名的数据。谢谢,但这不起作用。如果我在“选择”中使用alias,我将获得一个未定义的方法,并且我的调试仅提供来自建筑的3个元素。调试不会显示这些元素,因为它们不是对象的实例变量,但您可以使用[]hmm访问它们。。也许我没有足够的经验去做你告诉我的事情。但是Order.select的结果,你不把它放在@中吗?你把它放在一个变量中,比如:order=[]和order=order.select?
@search = @search.where("buildings.name like ?", "%#{params[:building_name]}%") if !params[:building_name].blank?