4

テーブルquestionsとデータファイルがありますquestions.yml。「質問」モデルはないと仮定します。

「questions.yml」には、テーブルからダンプされたレコードがいくつかあります。

---
questions_001:
  title: ttt1
  content: ccc1
questions_002:
  title: ttt2
  content: ccc2

yml ファイルからデータをロードし、データベースに挿入します。しかしrake db:fixtures:load、コンテンツを「erb」テンプレートとして扱うため、使用できません。これは望ましくありません。

そこで、データを手動でロードするために、別の rake タスクを書きたいと思います。

次の方法でレコードを読み取ることができます。

File.open("#{RAILS_ROOT}/db/fixtures/#{table_name}.yml", 'r') do |file|
   YAML::load(file).each do |record|
      # how to insert the record??
   end
end

しかし、それらを挿入する方法がわかりません。


編集:

私が試してみました:

Class.new(ActiveRecord::Base).create(record)

class Dummy < ActiveRecord::Base {}
Dummy.create(rcord)

しかし、データベースには何も挿入されていません

4

3 に答える 3

7

yml ファイルから に日付をロードした後、これを試してくださいrecords

class Question < ActiveRecord::Base
  # Question model just to import the yml file
end
records.each { |record| Question.create(record) }

インポート専用のモデルを簡単に作成できます。を作成する必要はありませんapp/models/question.rb。インポートを担当するスクリプトに上記のコードを記述するだけです。

アップデート:

次の機能を使用できます。

def create_class(class_name, superclass, &block)
  klass = Class.new superclass, &block
  Object.const_set class_name, klass
end

ソース

File.open("#{RAILS_ROOT}/db/fixtures/#{table_name}.yml", 'r') do |file|
  YAML::load(file).each do |record|
    model_name = table_name.singularize.camelize
    create_class(model_name, ActiveRecod::Base) do
      set_table_name table_name.to_sym
    end
    Kernel.const_get(model_name).create(record)
  end
end

接続を直接使用するには、次を使用できます。

ActiveRecord::Base.connection.execute("YOUR SQL CODE")
于 2010-06-21T07:09:37.640 に答える
1

これにより、フィクスチャが現在の RAILS_ENV (デフォルトでは開発用) にロードされます。

$ rake db:fixtures:load
于 2015-10-13T04:13:28.710 に答える
0

@jigfox の回答のおかげでうまくいきました。Rails 4 で完全に実装するには、少し変更する必要がありました。

table_names = Dir.glob(Rails.root + 'app/models/**.rb').map { |s| Pathname.new(s).basename.to_s.gsub(/\.rb$/,'') }    

table_names.each do |table_name|
  table_name = table_name.pluralize
  path = "#{Rails.root}/db/fixtures/#{table_name}.yml"
  if File.exists?(path)
    File.open(path, 'r') do |file|
      y = YAML::load(file)
      if !y.nil? and y
        y.each do |record|
          model_name = table_name.singularize.camelize
          rec = record[1] 
          rec.tap { |hs| hs.delete("id") }
          Kernel.const_get(model_name).create(rec)
        end
      end
    end
  end
end
于 2014-02-04T16:56:27.710 に答える