2

Rails 2.2.2 アプリケーションを継承し、Rails 3.2 にアップグレードするように求められたので、古い Rails 2.2.2 プロジェクトのコピー バージョンでスクリプト git://github.com/rails/rails_upgrade.git を実行しました。ディレクトリに保存して、途中で変更できるようにします。

ActiveRecord クエリを調べて、新しい Rails 3 で、find(:all)、find(:first)、条件付きの検索、:joins オプションなど、間もなく非推奨になる ActiveRecord 呼び出しのすべてを変更しています。 ActiveRecord API 構文。

私はここを見てきましたが、新しい構文に変更する必要があるクエリのいくつかには例がないので、それらが何であるかを把握するために最善を尽くしました.

以下の変更で正しい軌道に乗っているかどうか誰かに教えてもらえますか?

ありがとう

例 1

 #### Rails 2.x.x version
 @users = B2bUser.find(:all, :order => "name", :order => "#{params[:sort]} #{params[:direction]}")

 #### Rails 3.x.x version
 @users = B2bUser.order("name","#{params[:sort]} #{params[:direction]}")

例 2

 ### should work for both Rails 2.x and Rails 3.x
 @user = B2bUser.find(params[:id])

 #### Or is this better?
 @user = B2bUser.where("id = ?",params[:id])


 #### Rails 2.x.x version
 @privileges = B2bPrivilege.find(:all, :conditions => "b2b_user_id = #{@user.id}")

 ### Rails 3.x.x version
 @privileges = B2bPrivilege.where("b2b_user_id =  ?",@user.id)

例 3

 #### Rails 2.x.x version
@privileges = B2bPrivilege.find(:all, :conditions => "b2b_user_id = #{@user.id}", :joins => "LEFT JOIN vendors ON vendors.id = b2b_privileges.vendor_id", :select => "b2b_privileges.*, vendors.name AS vendor_name", :order => "vendors.name")

#### Rails 3.x.x version 
@privileges = B2bPrivilege.find_by_sql( "SELECT b2b_privileges.*, vendors.name AS vendor_name FROM b2b_privileges LEFT JOIN vendors ON vendors.id = b2b_privileges.vendor_id WHERE b2b_user_id = ?  ORDER BY vendors.name", @user.id)

例 4

    #### Rails 2.x.x version
    @vendor_list = Vendor.find(:all, :conditions => "is_active = 'YES'", :order => "name", :select => "id, name")

    #### Rails 3.x.x version
    @vendor_list = Vendor.find_by_sql("SELECT id, name FROM vendors WHERE is_active = 'YES' ORDER BY name")

例 5

 #### Rails 2.x.x version
 @existing = B2bPrivilege.find(:first, :conditions => "b2b_user_id = #{@user.id} AND vendor_id = #{params[:add_vendor][:id]}", :select => "id")

 #### Rails 3.x.x version   
 @existing = B2bPrivilege.find_by_sql("SELECT id FROM b2b_privileges WHERE b2b_user_id = ? AND vendor_id = ? LIMIT 1",@user.id,params[:add_vendor][:id])
4

1 に答える 1

2

例 3、4、および 5 はwherelimitおよびselectメソッドで構成する必要があります。

@vendor_list = Vendor.where(:is_active => 'YES')
                     .select(:id, :name)
                     .order(:name)
@existing = B2bPrivilege.where(b2b_user_id => params[:add_vendor], vendor_id => params[:id])
                        .select(:id)
                        .limit(1)

それ以外は、素晴らしくクリーンな実装を行っていると思います。

于 2013-02-18T16:35:46.310 に答える