Rails - 如何使用查找或创建默认值

时间:2011-04-23 21:44:52

标签: ruby-on-rails ruby-on-rails-3

我目前有以下内容:

    conversation_participation = @user.conversation_participations.find_or_create_by_conversation_id(conversation.id)

这正确地创建了一条记录,问题是conversation.read的默认值为false。

在这个特定的方法中,我希望在创建记录时默认值为true。现在我开始工作的唯一方法是:

    conversation_participation = @user.conversation_participations.find_or_create_by_conversation_id(conversation.id)
    conversation_participation.read = true
    conversation_participation.save

问题是这次击中了DB两次。如何使用find_or_create并设置默认值:read =>真?

由于

3 个答案:

答案 0 :(得分:1)

您可以尝试find_or_initialize_by...

然后将read属性设置为正常

conversation_participation = @user.conversation_participations.find_or_initialize_by_conversation_id(conversation.id)
conversation_participation.read = true
conversation_participation.save

conversation_participation = @user.conversation_participations.find_or_initialize_by_conversation_id_and_read(conversation.id, true)
conversation_participation.save

使用after_initialize(哦..你删除了你的评论,但这里的内容是为了以防万一)

class Conversation < ActiveRecord::base
  def after_initialize
    self.read ||= true # true if not already set
  end
end

然后你可以find_or_create|initialize_by...或者你希望继续进行。

如果您有兴趣,请点击callbacks

答案 1 :(得分:1)

来自here

  

使用find_or_initialize_by_   如果你想要返回一个新的查找器   记录而不先保存。

这样的事情:

conversation_participation = @user.conversation_participations.find_or_initialize_by_conversation_id(conversation.id)
conversation_participation.read = true
conversation_participation.save

这应该只是INSERT而不是INSERT后跟UPDATE

答案 2 :(得分:0)

试试这个:

conversation_participation = @user.conversation_participations.find_or_create_by_conversation_id_and_read(conversation.id, true)