Rails在内部将范围转换为类方法,那么为什么我们不能自己使用类方法而不是使用范围.
如果我们使用字符串作为哈希键,Ruby需要评估字符串并查看其内容(并计算其上的哈希函数)并将结果与已存储在哈希中的键的(哈希)值进行比较.
如果我们使用一个符号作为Hash键,它隐含着它是不可变的,所以Ruby基本上只是将object-id的(哈希函数)与已经存储在其中的键的(哈希)对象-id进行比较.哈希.(快多了).
但事情是在Rails params
中的实例HashWithIndifferentAccess
,如果我们写params[:some_key]
它转换:some_key
为'some_key'
然后它试图寻找params散列中的键.
第159行
def convert_key(key)
key.kind_of?(Symbol) ? key.to_s : key
end
Run Code Online (Sandbox Code Playgroud)
因此,如果在Hash HashWithIndifferentAccess
中将String作为键,查找速度很慢,为什么将符号键转换为字符串.
我将用户杂项数据存储在user_data表中,当我使用我定义的关联检索该数据时,我实际上是使用像这样的Ruby实例变量缓存来缓存它.
def user_data(user_id)
@user_data || = User.find(user_id).data
end
Run Code Online (Sandbox Code Playgroud)
但实例变量@user_data
只会在第一次为nil时分配值,一旦它为用户保存数据,就让user_id等于1,当我在这个方法中传递user_id 2时,它返回user_id 1的数据,因为它不会为它分配新值所以我的问题是我如何根据函数的参数缓存它的值.
我正在使用 Searchkick 与我的 Rails 应用程序中的弹性搜索 api 进行交互,并且它几乎在所有情况下都能正常工作,但我面临的问题是我的模型中有状态字段,并且通过选择所有复选框,用户可以更改所有记录的状态,因此我使用它更新数据,update_all
不会触发任何回调,并通过after_commit
回调重新索引数据。因为我的数据没有以reindexed
这种方式进入 Elastic Search,所以它给出了相同的结果,我应该做什么,Model.reindex
手动调用是一个不错的选择吗?
我研究了Ruby类,实例方法和我发现的主要区别之间的主要区别是我们不需要创建该类的实例,我们可以直接在类名上直接调用该方法.
class Notifier
def reminder_to_unconfirmed_user(user)
headers['X-SMTPAPI'] = '{"category": "confirmation_reminder"}'
@user = user
mail(:to => @user["email"], :subject => "confirmation instructions reminder")
end
end
Run Code Online (Sandbox Code Playgroud)
所以,在这里我reminder_to_unconfirmed_user
在我的Notifier
类中定义了实例方法,以便向未经证实的用户发送电子邮件,当我运行Notifier.reminder_to_unconfirmed_user(User.last)
它时,如果它是实例方法而不是类方法则调用它.
来自Rails Active Record我想知道如何实际获取今天创建的记录.
在Rails中我们可以这样做
User.where(created_at:Date.today.beginning_of_day..Date.today.end_of_day)
Run Code Online (Sandbox Code Playgroud)
或者说得很简洁
scope :created_today, ->(date = Date.today) { where(created_at: date..date.end_of_day) }
User.created_today
Run Code Online (Sandbox Code Playgroud)
用Ecto实现同样的东西最好的方法是什么?
我在rails中经历了after_save和after_commit回调的不同之处,我发现主要区别是在创建和更新时调用了after_commit,有没有办法只在create上调用after_commit?