代码之家  ›  专栏  ›  技术社区  ›  P Shved

Rails中是否有find\u或create\u by\u接受哈希?

  •  9
  • P Shved  · 技术社区  · 14 年前

    task = Task.find_or_create_by_username_and_timestamp_and_des \
    cription_and_driver_spec_and_driver_spec_origin(username,tim \
    estamp,description,driver_spec,driver_spec_origin)
    

    是的,我正在努力寻找或创造一个独特的 ActiveRecord::Base

    task = Task.SOME_METHOD :username => username, :timestamp => timestamp ...
    

    我知道 find_by_something key=>value ,但这不是一个选择。我需要所有的价值观都是独一无二的。有没有一种方法可以和 find_or_create_by

    2 回复  |  直到 14 年前
        1
  •  18
  •   wuputah    10 年前

    first_or_create 到ActiveRecord。它不仅具有所请求的功能,而且还适合其他ActiveRecord关系:

    Task.where(attributes).first_or_create
    

    在Rails 3.0和3.1中:

    Task.where(attributes).first || Task.create(attributes)
    

    Task.first(:conditions => attributes) || Task.create(attributes)
    

    在旧版本中,您总是可以编写一个名为 find_or_create

    class Task
      def self.find_or_create(attributes)
        # add one of the implementations above
      end
    end
    
        2
  •  3
  •   wuputah    10 年前

    我还扩展了@wuputah的方法来接受散列数组,这在内部使用时非常有用 db/seeds.rb

    class ActiveRecord::Base
      def self.find_or_create(attributes)
        if attributes.is_a?(Array)
          attributes.each do |attr|
            self.find_or_create(attr)
          end
        else
          self.first(:conditions => attributes) || self.create(attributes)
        end
      end
    end
    
    
    # Example
    Country.find_or_create({:name => 'Aland Islands', :iso_code => 'AX'})
    
    # take array of hashes
    Country.find_or_create([
      {:name => 'Aland Islands', :iso_code => 'AX'},
      {:name => 'Albania', :iso_code => 'AL'},
      {:name => 'Algeria', :iso_code => 'DZ'}
    ])