如何将非列参数传递给ActiveRecord new?

2ledvvac  于 2022-10-15  发布在  Ruby
关注(0)|答案(1)|浏览(213)

让我们假设我有一个如下所示的MySQL表。

create table users (
    id int,
    full_name varchar(30)
);

我想用User.new(id: 1, first_name: "Michael", last_name: "Jackson")创建一个模型,但ActiveRecord引发了unknown attribute 'first_name' for User.
User类只是一个例子,我希望它是一个元类(就像Employee < User)。所以,创建build方法并不是我真正想要的方式。

class User
  attr_accessor :first_name, :last_name

  before_create :create_full_name

  def create_full_name
    self.full_name = "#{first_name} #{last_name}"
  end
end 

user = User(id: 1)
user.first_name = "Michael"
user.last_name = "Jackson"

已经很接近了,但这需要外部的额外任务。我不想要这种裁员。
有什么办法可以做到这一点吗?

ivqmmu1c

ivqmmu1c1#

您可以使用初始化方法来设置属性。您还可以使用Send方法来设置属性。例如:

class User
  attr_accessor :first_name, :last_name

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end
end

user = User.new(id: 1, first_name: "Michael", last_name: "Jackson")
p user.first_name
p user.last_name

# Output:

# "Michael"

# "Jackson"

相关问题