Ruby on Rails:将两个数据连接成一列

时间:2012-10-05 09:53:40

标签: ruby-on-rails ruby database concatenation

我的表项目中有3列。 first_name,last_name和fullname。

<%= f.hidden_field :first_name, :value => current_user.firstname %>
<%= f.hidden_field :last_name, :value => current_user.lastname %>

在用户保存项目时,用户的名字和姓氏将保存到单独的列中。我现在想要将名字和姓氏保存到列全名,所以我可以稍后搜索它们。

所以如果名字是

first_name = "Joe"
last_name = "Bloggs"

我将如何获得

fullname =  "Joe Bloggs"

我试过这个,但它不起作用。

<%=f.hidden_field :fullname, :value => :first_name + :last_name %>

有人能指出我正确的方向吗?我是铁杆的新手所以请在尝试帮助时记住这一点。感谢。

更新

现在我已将此添加到我的项目模型中:

def set_fullname
    fullname = first_name + last_name
  end

我现在在我看来称之为:

<%= f.hidden_field :first_name, :value => current_user.firstname %>
<%= f.hidden_field :last_name, :value => current_user.lastname %>
<%= f.hidden_field :fullname, :value => @project.fullname %>

当我点击提交时,我检查日志,照常将姓名和姓氏保存到表中,但全名为空。任何人都可以看到问题所在吗?

UPDATE2

查看:

<%= f.hidden_field :first_name, :value => current_user.firstname %>
<%= f.hidden_field :last_name, :value => current_user.lastname %>
<%= f.hidden_field :fullname, :value => @project.set_fullname %>

项目模型:

def set_fullname
    fullname = first_name + last_name
  end

当我尝试访问该页面时,我收到此错误。

undefined method `+' for nil:NilClass

2 个答案:

答案 0 :(得分:7)

视图中的Ruby代码在加载表单时执行,到那时表单中没有内容(如果您创建新记录)。在javascript中编写类似的代码并将其映射到onchange事件first_namelast_name文本字段是有意义的。

或者您可以在模型的服务器端执行此操作,例如:

class Person

  before :save, :set_fullname

  def set_fullname
    fullname = "#{first_name} #{last_name}"
  end
end
每次更新模型时都会执行

before :save

无论如何,更干净的解决方案是调整您的搜索查询,这样您只需复制数据库中的信息。

在搜索时尝试这样的事情:

"first_name LIKE ? or last_name LIKE ? or concat(last_name, ', ', first_name) LIKE ?"

这个SQL代码可能依赖于数据库,如果你使用的是MySQL,那可能就行了

答案 1 :(得分:0)

我知道Tombart已经回答了这个问题,但这可以帮助其他人。

class Person

  before_create do
    self.fullname = "#{first_name} #{last_name}"
  end
end

您可以在RailsGuides找到更多信息。