我目前在我的模型中表示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
和2. :condition =>["users.full_name like ?", ...]
,我能想到的唯一方法就是修改模型。我也只想在json对象中返回属性id
和full_name
。
答案 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控制台中为所有用户运行save
或save!
方法。
$> 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中会更快。