2012-02-24 2 views
0

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

<%= 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 

Здесь контроллер поиска (спасибо Юле за предложение):

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", 

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

Вот консольный вывод, который показывает входные параметры и как «1» сохраняется для local_id и city_id. В этом сценарии я выбрал 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]] 

Стол города чистый.

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

+0

Ваш код контроллера может быть полезен здесь – Yule

+0

Можете ли вы разместить код для вашей модели 'Поиск'? –

ответ

0
<li>Select City <%= f.select(:city, City.order(:name).collect(&:name), {:prompt => "Enter Cities"}, {:multiple => true})%></li> 
+0

Это дает тот же результат. Вместо «Алгонкин», как: город, модель показывает «--- \ n- '' \ n- '' \ n- Algonquin \ n" – tbone

+0

может быть, что сама запись города содержит значение типа '" - - \ n- '' \ n- '' \ n- Algonquin \ n "'. Можете ли вы просмотреть данные в таблице городов –

+1

Да, я сделал, городской стол чист. Этот синтаксис «---/n-» .... выглядит как синтаксис сериализации. Я удалил столбец: city, добавил столбец: city_id и создал принадлежность к has_many. Проблема решена ... хотя я не знаю, t понять, как проблема началась в первую очередь! У меня все еще есть проблема, когда число «1» вставляется в поле «local_id» и «now_name», даже если ничего не выбрано! Также, если я выберу другие города или районы, результаты все равно city_id => 1 и neighbour_id => 1. Очень странно. – tbone

Смежные вопросы