【问题标题】:Rails - How to use find or create with a default valueRails - 如何使用默认值查找或创建
【发布时间】:2011-04-23 21:44:51
【问题描述】:

我目前有以下:

    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

问题是这两次命中数据库。如何使用 find_or_create 并设置默认值 :read => true?

谢谢

【问题讨论】:

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


    【解决方案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如果您有兴趣。

    【讨论】:

    • 如果你想在里面设置一个默认值,你可以查看after_initialize
    【解决方案2】:

    来自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

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

      • 等等,但这不好,因为如果存在一个conversation_participation且读取为false,这是非常有效的,这将创建一个新记录,不是吗?
      猜你喜欢
      • 1970-01-01
      • 2018-05-10
      • 2019-01-07
      • 2015-12-04
      • 2013-07-28
      • 1970-01-01
      • 2016-02-13
      • 2012-09-24
      • 2018-02-09
      相关资源
      最近更新 更多