相关疑难解决方法(0)

如何在ActiveRecord中设置默认值?

如何在ActiveRecord中设置默认值?

我看到Pratik的一篇文章描述了一段丑陋,复杂的代码:http://m.onkey.org/2007/7/24/how-to-set-default-values-in-your-model

class Item < ActiveRecord::Base  
  def initialize_with_defaults(attrs = nil, &block)
    initialize_without_defaults(attrs) do
      setter = lambda { |key, value| self.send("#{key.to_s}=", value) unless
        !attrs.nil? && attrs.keys.map(&:to_s).include?(key.to_s) }
      setter.call('scheduler_type', 'hotseat')
      yield self if block_given?
    end
  end
  alias_method_chain :initialize, :defaults
end
Run Code Online (Sandbox Code Playgroud)

我已经看到以下示例谷歌搜索:

  def initialize 
    super
    self.status = ACTIVE unless self.status
  end
Run Code Online (Sandbox Code Playgroud)

  def after_initialize 
    return unless new_record?
    self.status = ACTIVE
  end
Run Code Online (Sandbox Code Playgroud)

我也看到人们把它放在他们的迁移中,但我宁愿看到它在模型代码中定义.

是否有规范方法为ActiveRecord模型中的字段设置默认值?

ruby-on-rails rails-activerecord

407
推荐指数
11
解决办法
18万
查看次数

如何使用Rails中的值初始化ActiveRecord?

在普通的java中我会使用:

public User(String name, String email) {
  this.name = name;
  this.email = f(email);
  this.admin = false;
}
Run Code Online (Sandbox Code Playgroud)

但是,我在使用ActiveRecords的rails(3.2.3)中找不到简单的标准方法.

1.覆盖初始化

def initialize(attributes = {}, options = {})
  @name  = attributes[:name]
  @email = f(attributes[:email])
  @admin = false
end
Run Code Online (Sandbox Code Playgroud)

但是从DB创建记录时可能会错过

2.使用after_initialize回调

通过覆盖它:

def after_initialize(attributes = {}, options = {})
  ...
end
Run Code Online (Sandbox Code Playgroud)

或者用宏:

after_initialize : my_own_little_init
def my_own_little_init(attributes = {}, options = {})
  ...
end
Run Code Online (Sandbox Code Playgroud)

但可能存在一些弃用问题.

SO中还有其他一些链接,但它们可能已过时.


那么,使用什么是正确/标准的方法?

activerecord ruby-on-rails ruby-on-rails-3.2

25
推荐指数
3
解决办法
5万
查看次数

创建如果ActiveRecord中不存在函数?

我正在使用Rails 3.2.8.如果状态记录尚不存在,我需要创建状态记录.如果存在状态记录,我什么都不做.所以我的代码是这样的:

user_level_status = UserLevelStatus.where(user_id: user_id, level_id: level_id).first
if !user_level_status
  UserLevelStatus.create(user_id: user_id, level_id: level_id, status: UserLevelStatus::READY)
end
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来处理Rails/ActiveRecord?有没有相同的机制find_or_create_by_?我可以使用find_or_create_by_user_id并检查level_id吗?我只是放弃了结果,所以即便这样也不那么优雅.

sql activerecord ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

7
推荐指数
3
解决办法
6638
查看次数

为模型属性提供默认值

我生成了一个包含以下字段的用户模型,user_identifier并且notification_time

rails g user user_identifier:string notification_time:string 
Run Code Online (Sandbox Code Playgroud)

现在我想将 设置notification_time为默认值17:00

什么是最好的方法来做到这一点?写回调?如果是,如何?

activerecord ruby-on-rails rails-activerecord ruby-on-rails-5

1
推荐指数
1
解决办法
3179
查看次数