Дополнительные данные вставляются в мою базу данных sqlite - PullRequest
0 голосов
/ 24 февраля 2012

В базу данных sqlite моей модели поиска введены неверные данные. Вместо «строка» данные вводятся как «--- \ n- '' \ n- строка \ n» для одного конкретного столбца (: город). Кроме того, число «1» вставляется автоматически для окрестности. ОБНОВЛЕНИЕ: я решил проблему со строкой, удалив столбец city и добавив city_id и связь BTHM. Теперь число «1» вставляется как для окрестности, так и для города. Вот код выбора коллекции в представлении:

<%= form_for @search do |f| %>
<li>Select City <%= f.collection_select(:city, City.order(:name), :name, :name, {:prompt => "Enter Cities"}, {:multiple => true})%></li>
<li>Select Neighborhood(s)<%= f.collection_select(:neighborhood_id, Neighborhood.order(:name), :id, :name, {:prompt => "Enter Chicago Neighborhood(s)"}, {:multiple => true}) %></li>
<li><%= f.submit 'Search' %> </br><%= link_to "Reset Search", root_path %></li>
<% end %>

Выбор идет к модели поиска, в которой хранятся все параметры поиска. Вот схема для модели City:

create_table "cities", :force => true do |t|
    t.string    "name"
    t.timestamp "created_at"
    t.timestamp "updated_at"
  end

И схема для модели поиска:

create_table "searches", :force => true do |t|
    t.string    "city"
    t.integer   "beds"
    t.decimal   "baths"
    t.integer   "price"
    t.string    "name"
    t.timestamp "created_at"
    t.timestamp "updated_at"
    t.integer   "neighborhood_id"
  end

Вот контроллер поиска (спасибо Yule за предложение):

class SearchesController < ApplicationController

  def index
    @searches = Search.all
  end

  def show
    @search = Search.find(params[:id])
    @user = current_user unless current_user.nil?
    @search.save
    @listings = @search.listings
    if @listings.blank?
    else
      @listings = @listings.flatten
      @no_search_results = @listings.count
      @json = @listings[0,250].to_gmaps4rails do |listing, marker|
              marker.json "\"id\": #{listing.id}"
      end
    end
  end

  def new
    @search = Search.new
    @search.save  
    redirect_to @search
  end

  def create
    @search = Search.new(params[:search])
    @search.user_id = session[:user_id] unless session[:user_id].nil?
    @search.save
    redirect_to @search   
  end

  def destroy
    @search = Search.find(params[:id])
    @search.destroy    
  end

  def edit
  end

  def update
     @search = Search.find(params[:id])
     @search.update_attributes(params[:search])
     redirect_to @search
  end
end

А вот и модель поиска:

class Search < ActiveRecord::Base

  belongs_to :user 
  has_and_belongs_to_many :neighborhoods
  has_and_belongs_to_many :cities

  scope :named, where("name IS NOT NULL")  # for view: only show searches for user where user has saved a name.

  def listings
    @listings ||= find_listings
  end

  private

  def find_listings

    i = 0
    batch_size = 4000
    max_return = 150
    total_listings = 0
    db_size = Listing.count
    search_results =[]

    while total_listings < max_return && batch_size*i <= db_size do


      listings = Listing.order(:price).limit(batch_size).offset(i*batch_size).scoped

      if neighborhood_id.present?
        listings = listings.where(:neighborhood_id => neighborhood_id)
      end

      if city.present?
        listings = listings.where("city LIKE ?", city)
      end
    i = i + 1
         search_results << listings
         if search_results.present?
         total_listings = total_listings + search_results.flatten.count  
         else
         end

        end
        if search_results.present?
          listings = search_results.flatten[0..149]
        else
          return nil
        end
  end
end

В моей среде разработки, когда я выбираю 'Algonquin', он вставляется в базу данных следующим образом:

=> #<Search id: 322, city: "---\n- ''\n- Algonquin\n",

Кроме того, окрестность всегда устанавливается на «1», даже если окрестность вообще не выбрана!

Вот вывод консоли, который показывает входные параметры и то, как '1' сохраняется для окрестности_ид и города_ид. В этом сценарии я выбрал 3 спальни и город 'Algonquin', который теперь имеет city_id => 1148, и я не выбрал ни одного района.

Parameters: {"utf8"=>"✓", "authenticity_token"=>"cS4xGLsBZJASlEmexmR2tUSMV+doBX30C14jHFRDqTA=", "search"=>{"city_id"=>["", "1148"], "neighborhood_id"=>[""], "max_distance"=>"", "m_max_distance"=>"", "beds"=>"3", "baths"=>"", "min_price"=>"", "price"=>"", "user_id"=>""}, "commit"=>"Search"}
   (0.1ms)  begin transaction
  SQL (1.1ms)  INSERT INTO "searches" ("baths", "beds", "city_id", "created_at",  "min_price", "neighborhood_id", "price", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)  [["baths", nil], ["beds", 3], ["city_id", 1], ["created_at", Sat, 25 Feb 2012 08:15:04 CST -06:00], ["min_price", nil], ["neighborhood_id", 1], ["price", nil], ["updated_at", Sat, 25 Feb 2012 08:15:04 CST -06:00], ["user_id", nil]]

Стол в Сити чист.

У кого-нибудь есть идеи о том, почему это происходит, или какие-то стратегии для диагностики или устранения проблемы? Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 24 февраля 2012
<li>Select City <%= f.select(:city, City.order(:name).collect(&:name), {:prompt => "Enter Cities"}, {:multiple => true})%></li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...