Проблема реализации модели - PullRequest
0 голосов
/ 19 декабря 2011

По крайней мере, я думаю, что в этом проблема ... Я пытаюсь создать страницу, где подстрока отправляется через строку запроса, и члены данного массива, которые соответствуют подстроке, отображаются на странице.Я знаю, что логика в моей модели работает, но, очевидно, что-то идет не так, потому что, когда я отправляю подстроку, которая соответствует нескольким элементам массива, она возвращается с "без совпадений".Я почти уверен, что проблема где-то в модели, или миграции.

Вот модель:

class State < ActiveRecord::Base
def State.filter(matching_string)

    matcher = Regexp.new(matching_string, Regexp::IGNORECASE)
    @new_array = []
    State.select{|x| if matcher =~ x then @new_array << x end}
    return @new_array

end
end

Вот миграция:

class CreateStates < ActiveRecord::Migration


 def self.up

  list_of_states = ["Alabama", "Alaska", "Arizona", "Arkansas", "California",
    "Colorado", "Connecticut", "Delaware", "Florida", "Georgia",
    "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa",
    "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland",
    "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri",
    "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey",
    "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio",
    "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina",
    "South Dakota", "Tennessee", "Texas", "Utah", "Vermont",
    "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"]


    create_table :states do |t|
        t.string :name
        t.timestamps
    end
    State.reset_column_information
    for x in list_of_states
            State.create(:name => x)

    end
     State.all.collect {|x| x.name}
  end



  def self.down
    drop_table :states
  end
end

Ивот контроллер:

class StatesController < ApplicationController
def filter
    @states = State.filter(params[:substring])
    @entered_string = params[:substring]
end end

TIA!

1 Ответ

0 голосов
/ 19 декабря 2011

Я думаю, что проблема, которую вы испытываете, связана с неправильным использованием метода select. Реализация ActiveRecord :: Base используется для выбора определенных столбцов. Вы передаете блок методу, который его не хочет, поэтому он игнорируется. Чистый результат - ничто.

В Ruby существует несколько соглашений, которые сделают такого рода неправильное поведение более очевидным и легче исправить. Например, вот как метод был бы написан, если бы он был сделан в соответствии с соглашениями Ruby:

class State < ActiveRecord::Base
  def self.filter(matching_string)
    pattern = Regexp.new(matching_string, Regexp::IGNORECASE)

    State.select{ |state| state.name.match(pattern) }
  end
end

Вы обнаружите, что результат этого метода всегда nil, поэтому что-то не так. То, что вы на самом деле хотите, больше похоже на это:

class State < ActiveRecord::Base
  def self.filter(matching_string)
    pattern = Regexp.new(matching_string, Regexp::IGNORECASE)

    @states ||= State.all
    @states.select{ |state| state.name.match(pattern) }
  end
end

Это предполагает, что вы не добавляете и не удаляете состояния между перезапусками приложения. Это довольно безопасное предположение при работе с данными, предназначенными только для США, тем более что ваши данные загружаются в процессе миграции и не доступны для редактирования пользователем.

Вы также можете просто выполнить поиск в базе данных, используя оператор LIKE:

class State < ActiveRecord::Base
  def self.filter(matching_string)
    State.where('name LIKE ?', "%#{matching_string}%")
  end
end

Первый метод работает лучше для небольших списков состояний, последний - для больших списков. В этом случае «большой» означает 1000 +.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...