user first_name last_name字段用于创建full_name字段
我的rails中有我的模型中当前表示的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
我希望能够1. select: 'users.id, users.full_name
和select: 'users.id, users.full_name
:condition =>["users.full_name like ?", ...]
,我认为这样做的唯一方法是修改模型。 我也只想在json对象中返回属性id
和full_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.运行save
或save!
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中会更快。