1

我在 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和 2.:condition =>["users.full_name like ?", ...]我能想到的唯一方法是修改模型。我也只想返回属性idfull_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,那么我建议您执行以下步骤。

1.生成一个rails迁移,将字段添加full_nameusers表中。

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.Commit,将代码推送到生产环境,在生产环境中运行迁移。

4.在 Rails 控制台中对所有用户运行saveor方法。save!

$> 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 回答