1

モデルに現在レールで表されているフィールドが first_nameあります。last_nameデータベースにという別のフィールドを追加したいのfull_nameですが、これをシームレスに行うための最良の方法は何でしょうか。実稼働サーバーも稼働しているので、移行に列を追加するだけでなく、新しいフィールドに既存のデータを入力できるようにしたいと思います。

編集:

これが私のコントローラーです

def followers
    @title = "Followers"
    @user = User.find(params[:id])
    @users = @user.followers.paginate(page: params[:page])
    @followers = @user.followers.find(:all, :select => 'users.id, users.first_name, users.last_name', :conditions => ["users.first_name like ?","%" + params[:q] + "%"])

    respond_to do |format|
      format.html {render 'show_follow'}
      format.json {render :json => @followers}
    end
end

select: 'users.id, users.full_name1.と2.ができるようになりたい:condition =>["users.full_name like ?", ...]のですが、これを行うために考えられる唯一の方法は、モデルを変更することです。idまた、プロパティとfull_namejsonオブジェクトのみを返したいです。

4

3 に答える 3

7

モデルでfull_nameメソッドを定義する方がよいでしょう。

def full_name                                                                                                                                                                                     
  ([first_name, last_name] - ['']).compact.join(' ')                         
end

次のようなフルネームで検索できます。

def self.find_all_by_name_containing(text)
  self.where("LOWER(first_name || ' ' || last_name) LIKE ?", "%#{text.downcase}%")
end

次に、独自の#to_jsonを定義します

于 2012-07-19T09:23:15.090 に答える
2

モデルにfull_nameフィールドを追加することを本当に進めたい場合は、次の手順をお勧めします。User

full_name1.フィールドをusersテーブルに追加してRailsの移行を生成します。

rails g migration add_full_name_to_users full_name:string

2.次のbefore_saveコールバックをUserモデルに追加します。

Class User < ActiveRecord::Base
  ...

  before_save :set_full_name

  private
  def set_full_name
    self.full_name = "#{self.first_name} #{self.last_name}".strip
  end
end

3.コミットし、コードを本番環境にプッシュし、本番環境で移行を実行します。

4. Railsコンソールで、すべてのユーザーに対してsaveorsave!メソッドを実行します。

$> User.find_each(:batch_size => 1000){ |user| user.save }

私は、それがあなたの既存のユーザーの更新の世話をするべきであると思います、そして、before_save呼び出しは将来の追加/更新の世話をします。

于 2012-07-19T09:26:07.633 に答える
0

移行を生成する

rails g migration add_full_name_to_users

内部移行:

def up
  add_column :users, :full_name, :string
  execute <<-SQL
    UPDATE users SET full_name = first_name||' '||last_name WHERE full_name IS NULL;
  SQL
end

full_name列を作成し、デフォルトのデータを入力します。rubyでもこのようなことを行うことができますが、SQLでははるかに高速になります。

于 2012-07-19T13:19:21.353 に答える