user first_name last_name字段用于创建full_name字段

时间:2012-07-19 08:48:39

标签: ruby-on-rails postgresql heroku migration

我目前在我的模型中表示first_namelast_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

我希望能够1. select: 'users.id, users.full_name和2. :condition =>["users.full_name like ?", ...],我能想到的唯一方法就是修改模型。我也只想在json对象中返回属性idfull_name

3 个答案:

答案 0 :(得分:6)

您可能最好只在模型中定义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

答案 1 :(得分:2)

如果您真的想继续向full_name模型添加User字段,那么我建议您执行以下步骤。

1.生成rails迁移,将字段full_name添加到users表。

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控制台中为所有用户运行savesave!方法。

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

我想,这应该照顾更新现有用户,而且before_save来电将负责未来的添加/更新。

答案 2 :(得分: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中会更快。