如何自动将ActiveRecord的字段值复制到新创建的关系?

时间:2013-01-25 16:26:55

标签: ruby-on-rails ruby rails-activerecord

我有以下课程:

class User < ActiveRecord::Base
  attr_accessible :language_id
  has_many :lists
end

class List < ActiveRecord::Base
  attr_accessible :language_id
  belongs_to :user
end

我想自动将用户的language_id分配给新创建的列表:

# list.language_id should be equal to user.language_id
list = user.lists.create

我发现最干净的解决方案是在List类中添加一个过滤器:

before_validation :assign_language_id, on: :create

def assign_language_id
  self.language_id = self.user.language_id
end

这似乎不是一个糟糕的解决方案,但我想知道Rails是否有一些神奇的处理方式。 我知道我总是可以要求list.user.language_id而不是复制它,但请假设我真的需要在这里。

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

两件事:

  1. 你有没有用户的名单吗?如果是,则回调将失败,您需要检查用户是否存在。
  2. 列表language_id总是与user.language_id相同?如果是,我建议您使用delegate :language, :language_id, :to => :user将language_id和语言委托给用户,您可以查看http://apidock.com/rails/Module/delegate以了解委托的工作方式以及更多选项。