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

我的rails中有我的模型中当前表示的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_nameselect: 'users.id, users.full_name :condition =>["users.full_name like ?", ...] ,我认为这样做的唯一方法是修改模型。 我也只想在json对象中返回属性idfull_name

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

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

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

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

我想,应该注意更新现有用户,而且before_save调用将负责未来的添加/更新。

生成迁移

 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中会更快。