ActiveRecord и sqlite3: найти не принимает никаких условий? - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть проблема, которую я не могу понять здесь.Я пишу сценарий ruby, который работает с базой данных sqllite.

require 'rubygems'
require 'sqlite3'
require 'active_record'


ActiveRecord::Base.establish_connection(
    :adapter => "sqlite3",
    :database  => "../database/my.db"
)

class KeyWord < ActiveRecord::Base
    set_table_name "keywords"
end

# THIS STATEMENT WORKS (finds the first record, returns "ruby") :    
KeyWord.find(1).keyval


# THOSE STATEMENTS RETURN NO RESULT :      
KeyWord.find(:all, :conditions => {:keyval => "ruby"})

KeyWord.find_by_sql("SELECT * FROM keywords WHERE keyval='ruby'")

KeyWord.find_by_keyval("ruby")

Вот как была создана таблица:

create_table :keywords do |table|
    table.column :keyval, :text
end

Кто-нибудь знает, откуда это может появиться?1007 *

Спасибо,

R.

1 Ответ

1 голос
/ 03 октября 2012

Я вижу здесь пару проблем.

  • Я не уверен, почему вы устанавливаете имя таблицы вручную. ActiveRecord предполагает, что ваша модель называется camelCased. Итак ... АР по умолчанию будет искать таблицу с именем key_words. Почему не просто пойти с этим?
  • Обратите внимание, какая версия активной записи у вас есть с помощью. Переход в условия не рекомендуется. Вы должны использовать .where синтаксис. Итак ... вам нужно было бы сделать KeyWord.where(:keyval => 'ruby').first или завершить .all для сбора результатов.
  • Если вы просто дурачитесь, вы можете использовать sqlite3 в памяти. ActiveRecord::Base.establish_connection( adapter: 'sqlite3', database: ":memory:")
  • Также не забудьте определить свою схему!

Вот полный код с более современным синтаксисом.

require 'rubygems'
require 'sqlite3'
require 'active_record'


ActiveRecord::Base.establish_connection( adapter: 'sqlite3', database: ":memory:" )

ActiveRecord::Migration.verbose = false
ActiveRecord::Schema.define(version: 2) do
  create_table :key_words do |t|
    t.text   :keyval
  end
end

class KeyWord < ActiveRecord::Base
end

Keyword.create!(:keyval => 'ruby')

# THESE STATEMENTS WORK:
KeyWord.find(1).keyval
KeyWord.where(:keyval => 'ruby').first 
KeyWord.where(:keyval => 'ruby').all
KeyWord.find_by_sql("SELECT * FROM key_words WHERE keyval='ruby'")
KeyWord.find_by_keyval("ruby")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...