Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails将首先初始化或由一个值初始化,但如果创建,则会添加更多值_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

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
参数进入新的作用域,通过调用
作用域
覆盖外部的。这并不十分明显,但确实发生了。