Ruby on rails ActiveRecord模型生命周期
Rails ActiveRecord模型可以包含许多方法调用,包括我使用的以下方法调用:Ruby on rails ActiveRecord模型生命周期,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,Rails ActiveRecord模型可以包含许多方法调用,包括我使用的以下方法调用: class Food < ActiveRecord::Base translates :name belongs_to :group, class_name: 'FoodGroup', foreign_key: :food_group_id has_many :components, through: :food_components has_and_belongs_to_many :
class Food < ActiveRecord::Base
translates :name
belongs_to :group, class_name: 'FoodGroup', foreign_key: :food_group_id
has_many :components, through: :food_components
has_and_belongs_to_many :tags, join_table: 'tagged_foods', class_name: 'FoodTag'
scope :dishes, ->{where is_dish: true}
include PgSearch
pg_search_scope :whose_name_starts_with_en, :against => :name_en,
...
end
class食品{u dish:true}
包括PgSearch
pg_search_scope:which_name_以_en开头,:country=>:name_en,
...
结束
所以我的问题是——这些代码什么时候执行?每次创建模型实例时?还是只有一次
我有这个问题是因为我需要将当前用户.id
传递到pg\u search\u scope
,并且不确定假设每个模型都有一个正确的用户id有多安全。所有这些“东西”基本上为您的模型添加了额外的方法。乙二醇
belongs_to :group, class_name: 'FoodGroup', foreign_key: :food_group_id
属于\u to
是“宏”的一个示例,它向模型中添加了大量方法
您可以自己编写所有这些方法,但输入“属于”可以省去您的麻烦
在加载类时执行,并“混合”新方法。因为它们是从其他模块中拉入的,所以您可以在模型定义中覆盖它们中的任何一个
当类被加载时,您拥有的所有其他示例也会被计算
正如您所怀疑的,当类被加载时,命名的作用域是“固定的”,因此您不能向它传递参数。但是,有一种方法允许命名范围使用“lambda”获取参数,它基本上是一个代码块。(有关更多信息,请参阅)
所有这些“东西”基本上会在模型中添加额外的方法。乙二醇
belongs_to :group, class_name: 'FoodGroup', foreign_key: :food_group_id
属于\u to
是“宏”的一个示例,它向模型中添加了大量方法
您可以自己编写所有这些方法,但输入“属于”可以省去您的麻烦
在加载类时执行,并“混合”新方法。因为它们是从其他模块中拉入的,所以您可以在模型定义中覆盖它们中的任何一个
当类被加载时,您拥有的所有其他示例也会被计算
正如您所怀疑的,当类被加载时,命名的作用域是“固定的”,因此您不能向它传递参数。但是,有一种方法允许命名范围使用“lambda”获取参数,它基本上是一个代码块。(有关更多信息,请参阅)
所有这些“东西”基本上会在模型中添加额外的方法。乙二醇
belongs_to :group, class_name: 'FoodGroup', foreign_key: :food_group_id
属于\u to
是“宏”的一个示例,它向模型中添加了大量方法
您可以自己编写所有这些方法,但输入“属于”可以省去您的麻烦
在加载类时执行,并“混合”新方法。因为它们是从其他模块中拉入的,所以您可以在模型定义中覆盖它们中的任何一个
当类被加载时,您拥有的所有其他示例也会被计算
正如您所怀疑的,当类被加载时,命名的作用域是“固定的”,因此您不能向它传递参数。但是,有一种方法允许命名范围使用“lambda”获取参数,它基本上是一个代码块。(有关更多信息,请参阅)
所有这些“东西”基本上会在模型中添加额外的方法。乙二醇
belongs_to :group, class_name: 'FoodGroup', foreign_key: :food_group_id
属于\u to
是“宏”的一个示例,它向模型中添加了大量方法
您可以自己编写所有这些方法,但输入“属于”可以省去您的麻烦
在加载类时执行,并“混合”新方法。因为它们是从其他模块中拉入的,所以您可以在模型定义中覆盖它们中的任何一个
当类被加载时,您拥有的所有其他示例也会被计算
正如您所怀疑的,当类被加载时,命名的作用域是“固定的”,因此您不能向它传递参数。但是,有一种方法允许命名范围使用“lambda”获取参数,它基本上是一个代码块。(有关更多信息,请参阅)
除了@Max Williams回答:
也可以写成
scope :dishes, ->(user) {where is_dish: true}
这是您的初始代码中使用的格式。除了@Max Williams answer:
也可以写成
scope :dishes, ->(user) {where is_dish: true}
这是您的初始代码中使用的格式。除了@Max Williams answer:
也可以写成
scope :dishes, ->(user) {where is_dish: true}
这是您的初始代码中使用的格式。除了@Max Williams answer:
也可以写成
scope :dishes, ->(user) {where is_dish: true}
这是初始代码中使用的表单。lambda!太好了,这就是我错过的,谢谢。只要想办法把它传给pg_scopelambda!太好了,这就是我错过的,谢谢。只要想办法把它传给pg_scopelambda!太好了,这就是我错过的,谢谢。只要想办法把它传给pg_scopelambda!太好了,这就是我错过的,谢谢。只需找到一种方法将其传递给pg_scope谢谢,我真的需要将用户id传递给
pg_search_scope
而不是常规的。它有一个ranking_by
选项,您可以在其中指定自己的排名sql,我必须将特定于用户的sql放在其中。谢谢@Martin,我以前没有使用过最新的语法。谢谢,我真的需要将用户id传递给pg_search_scope
而不是常规的。它有一个ranking_by
选项,您可以在其中指定自己的排名sql,我必须将特定于用户的sql放在其中。谢谢@Martin,我以前没有使用过最新的语法。谢谢,我真的需要将用户id传递给pg_search_scope
而不是常规的。它有一个ranking_by
选项,您可以在其中指定自己的排名sql,我必须将特定于用户的sql放在其中。谢谢@Martin,我以前没有使用过最新的语法。谢谢,我真的需要将用户id传递给pg_search_scope
而不是常规的。它有一个按