Ruby on rails Rails将首先初始化或由一个值初始化,但如果创建,则会添加更多值
以以下为例:Ruby on rails Rails将首先初始化或由一个值初始化,但如果创建,则会添加更多值,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,以以下为例: GroupMember.where(:member\u id=>4)。首先\u或\u初始化 如果我想说这样的话呢- 如果存在成员id为4的GroupMember,“查找它”。否则,创建一个组成员,其成员id为4,组id为7 因此,我希望上面的语句只检查member_id,但如果它不存在,我希望它创建一个具有多个属性的GroupMember。我该怎么写呢?我正在使用rails 4.0。使用 find_or_initialize_by_member_id_and_group_id(me
GroupMember.where(:member\u id=>4)。首先\u或\u初始化
如果我想说这样的话呢-
如果存在成员id为4的GroupMember,“查找它”。否则,创建一个组成员,其成员id为4,组id为7
因此,我希望上面的语句只检查member_id,但如果它不存在,我希望它创建一个具有多个属性的GroupMember。我该怎么写呢?我正在使用rails 4.0。使用
find_or_initialize_by_member_id_and_group_id(member_id, group_id)
您将通过成员id和组id创建GroupMember uniq。(by仅使用一次)
我不确定这句话在Rails4上是否有效。它正在Rails 3.2上运行
请检查rails控制台上的上述语句,并让我知道它是否适用于not
更新:
根据错误,控制台代码必须为:
GroupMember.find_or_initialize_by(member_id: member_id, group_id: group_id )
请验证更改是否有效这是我使用的参考-
该方法的源状态为:
def first_or_initialize(attributes = nil, &block)
first || new(attributes, &block)
end
因此,如果找不到记录,它将初始化一个新记录并传递给一个块
您可以使用它:
GroupMember.where(:member_id => 4).first_or_initialize do |member|
member.group_id = 7
end
它将仅对新记录执行块操作。尝试使用此命令
Post.find_or_create_by(member_id: member_id, group_id: group_id )
这也适用于:
GroupMember.where(member_id: 4).first_or_initialize(group_id: 7)
传递给first_或_initialize的属性仅在创建新记录时使用,并且它们与“where”子句中的属性合并。Rails控制台返回此消息:DEPRECATION警告:此动态方法已弃用。请使用Post.find_或_initialize_by(名称:'foo')代替。(从irb_binding at(irb):17调用)
原始版本在技术上在Rails 4中工作(到目前为止),它只显示前面提到的弃用警告luigi,并且仍然返回相同的数据@因此,如果在Rails的未来版本中,旧的find\u或\u initialize\u by…
版本被完全删除,那么您肯定希望使用Rubyist发布的第二个版本,以避免出现问题。非常感谢,这正是我想要感谢您的。这还允许我在初始化期间初始化多个其他列。它发生在ActiveRecord::Relation#new中,它构建了一个嵌套的作用域--其中
子句参数在外部作用域中,first\u或_initialize
参数进入新的作用域,通过调用作用域
覆盖外部的。这并不十分明显,但确实发生了。