2

画像ファイルのテーブルの AR 移行を作成する必要があります。画像はソース ツリーにチェックインされており、attachment_fu ファイルのように動作するはずです。そういうわけで、/public/system の下にそれらの階層を作成しています。

attachment_fu がリンクを生成する方法のため、ディレクトリの命名規則を使用して主キーの値を挿入する必要があります。次のようなことができるように、MySQL と Rails マジックの自動インクリメントをオーバーライドするにはどうすればよいですか。

image = Image.create(:id => 42, :filename => "foo.jpg")
image.id #=> 42
4

6 に答える 6

2

うーん、楽しい問題ではありません。私が考えることができる最も厄介な方法は、マイグレーションに、attachment-fu を介してすべてのファイルを実際に「アップロード」するコードを含めることです。これにより、プラグインが ID を作成してファイルを配置できるようになります。

このようなもの:

Dir.glob("/images/to/import/*.{jpg,png,gif}").each do |path|

  # simulate uploading the image
  tempfile = Tempfile.new(path)
  tempfile.set_encoding(Encoding::BINARY) if tempfile.respond_to?(:set_encoding)
  tempfile.binmode
  FileUtils.copy_file(path, tempfile.path)

  # create as you do in the controller - may need other metadata here
  image = Image.create({:uploaded_data => tempfile})
  unless image.save
    logger.info "Failed to save image #{path} in migration: #{image.errors.full_messages}"
  end

  tempfile.close!
end

attachment-fu のテストを見ると役に立つかもしれません。

于 2009-04-08T17:22:42.460 に答える
1

たとえば、Sybase とは異なり、MySQL では、insert ステートメントの列リストに id 列を指定すると、id に任意の有効な重複しない値を挿入できます。特別なことをする必要はありません。

Railsの魔法は、IDが自動インクリメントであることをRailsに知らせないことだと思います。これがこのテーブルに挿入する唯一の方法である場合は、id を auto_incrementにしないでください。null でない主キーを int にするだけです。

率直に言って、これはキーをデータとして使用しているので、不安です。attachment_fu が単に「id」という名前のを探している場合は、実際のデータである id という名前の列を作成し、「actual_id」という名前の列を実際の合成の auto_incremented キーにします。

于 2009-04-08T04:04:40.790 に答える
1
image = Image.create(:filename => "foo.jpg") { |r| r.id = 42 }
于 2010-06-10T22:51:24.550 に答える
0

これが私のクルーゲです:

class AddImages < ActiveRecord::Migration
  def self.up
    Image.destroy_all

    execute("ALTER TABLE images AUTO_INCREMENT = 1")

    image = Image.create(:filename => "foo.jpg")
    image.id #=> 1
  end

  def self.down
  end
end
于 2009-04-08T04:31:25.607 に答える
0

なぜこれを行う必要があるのか​​ を完全には理解していませんが、移行のためにこれを1回だけ行う必要がある場合は、移行で使用executeしてIDを設定してください(まだ取得されていないと仮定して、私はできます想像しないでください):

「INSERT INTO images (id, filename) VALUES (42, 'foo.jpg')」を実行します

于 2009-04-08T22:44:52.453 に答える
0

オブジェクトに対してこのタスクを直接実行できると思いますが、AdminMyServer に同意します。

image = Image.new :filename => "foo.jpg"
image.id = 42
image.save

また、将来の衝突を避けるために、プロセスの最後に ID 自動インクリメントが更新されていることを確認する必要があります。

newValue = Images.find(:first, :order => 'id DESC').id + 1
execute("ALTER TABLE images AUTO_INCREMENT = #{newValue}")

お役に立てれば。

于 2009-04-20T02:19:52.503 に答える