【问题标题】:user first_name last_name fields to create a full_name field用户 first_name last_name 字段以创建 full_name 字段
【发布时间】:2012-07-18 10:02:25
【问题描述】:

我有 first_namelast_name 字段当前在我的 rails 模型中表示。我想在我的数据库中添加另一个名为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

【问题讨论】:

  • 如果你创建的helper方法是fist_name和last_name的连接,数据库中是否必须有full_name?
  • 事情是我希望能够使用full_nameid 从控制器发送一个json 对象。现在我的控制器看起来像上面那样,我不知道如何使用辅助方法......

标签: ruby-on-rails postgresql heroku migration


【解决方案1】:

在模型中定义一个 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

【讨论】:

  • 那么我将如何在我的控制器中实现它,以便 json 只返回 idfull_name
  • 你可以像渲染一样使用 :json => @followers.to_json( :only => [:id], :methods => [:full_name])
【解决方案2】:

如果您真的想继续向您的 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.在 Rails 控制台中对所有用户运行 savesave! 方法。

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

我想,这应该负责更新您现有的用户,加上 before_save 调用将负责未来的添加/更新。

【讨论】:

  • 非常感谢!任何运行的人都会被警告:这将运行所有设置为 before_save 的操作 - 即,将发送设计确认电子邮件
【解决方案3】:

生成迁移

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-30
    相关资源
    最近更新 更多