簡體   English   中英

Ruby on Rails:從虛擬屬性組成模型的屬性

[英]Ruby on Rails: compose attribute of model from virtual attributes

我有模型人的屬性名稱

我想將html-form與以下字段一起使用: first_namesurname

<%= f.text_field first_name%>
<%= f.text_field surname%>

我想將這些虛擬屬性組成模型屬性名稱

最好的方法是什么?

我嘗試使用composition_of ,但是失敗了...

class Person < ActiveRecord::Base
  composed_of :name, :class_name => 'Name', :mapping => %w(name output_name)
end

class Name
  attr_reader :output_name
  def initialize(first_name, surname)
    @output_name = first_name + surname
  end
end

@person.attributes= {"name(1s)" => 'Alex', "name(2s)" => 'Bolduin' }
@person.name.should == 'Alex Bolduin'

expected: "Alex Bolduin",
got: #<Name:0x000000049d4c08 @output_name="Alex Bolduin"> (using ==)

我使用Ruby on Rails 3,但我認為Rails 3和Rails 2.3的解決方案相似

您應該能夠在模型中創建一個偽裝的列,執行以下操作:

class Person < ActiveRecord::Base
    def name
      "#{self.first_name} #{self.surname}"
    end

    def name=(fullname)
      first,last = fullname.split(' ')  # or some smarter way to split
      self.first_name = first
      self.surname = last
    end
end

應該以與其他任何列相同的方式訪問它,並且當您嘗試設置name ,它將僅調用first_namesurname的setter方法。


如果您想做相反的事情,仍然可以使用相同的技巧:

class Person < ActiveRecord::Base
    def first_name
      name.split(' ')[0]
    end

    def surname
      name.split(' ')[1]
    end

    def first_name=(first)
      name = [first, name.split(' ')[1]].join(' ')
    end

    def surname=(sname)
      name = [name.split(' ')[0], sname].join(' ')
    end

end

唯一可能帶來的不利影響是,字符串操作每次讀取一次,每次寫入兩次。 您可以通過在@person.save之前添加類似的內容來創建/更新,從而在控制器中捕獲內容:

@person.name = [first_name, surname].join(' ')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM