Несколько внешних ключей столбца / ассоциации в ActiveRecord/Rails

Можно использовать встроенный firebird, это - просто dll, что необходимо будет поставить с Вами приложение.

О вещах, являющихся недокументированным, это не действительно верно, firebird драйвер.NET реализует Интерфейсы ADO, поэтому если Вы знаете ADO, можно работать с Firebird, в основном вместо SQLConnection, Вы будете использовать FBConnection и так далее, но мой совет состоит в том, чтобы записать уровень доступа к данным, и использование просто взаимодействует через интерфейс на Вашем коде, чем-то вроде этого:

using FirebirdSql.Data.FirebirdClient;

public static IDbConnection MyConnection()
{
    FbConnection cn = new FbConnection("...");
    return cn;
}

Этот пример очень прост, но Вам не будет нужно намного больше, чем это.

Мы используем firebird для нашего всего приложения без любых проблем, необходимо, по крайней мере, испытать его.

8
задан Sai 28 October 2009 в 00:09
поделиться

1 ответ

Похоже, будет лучше, если вы разделите значок на две модели. Вот как я бы разбил его, чтобы достичь желаемой функциональности. Я добавил несколько именованных областей видимости, чтобы сохранить код, который действительно делает вещи чистыми.

class BadgeSet
  has_many :badges
end

class Badge
  belongs_to :badge_set
  validates_uniqueness_of :badge_set_id, :scope => :level

  named_scope :with_level, labmda {|level
    { :conditions => {:level => level} }
  }

  named_scope :next_levels, labmda {|level
    { :conditions => ["level > ?", level], :order => :level }
  }

  def next_level 
    Badge.next_levels(level).first
  end
end

class Badging < ActiveRecord::Base
  belongs_to :user
  belongs_to :badge 
  belongs_to :badge_set
  belongs_to :badgeable, :polymorphic => true

  validates_uniqueness_of :badge_set_id, :scope => [:user_id, :badgeable_id]
  validates_presence_of :badge_set_id, :badge_id, :user_id  

  named_scope :with_badge_set, lambda {|badge_set|
    {:conditions => {:badge_set_id => badge_set} }
  }

  def level_up(level = nil)
    self.badge = level ? badge_set.badges.with_level(level).first 
      : badge.next_level
    save
  end
end

class User < ActiveRecord::Base
  has_many :badgings, :dependent => :destroy do
    def grant badgeset, level, badgeable = nil
      b = badgings.with_badgeset(badgeset).first() || 
         badgings.build(
            :badge_set => :badgeset,
            :badge => badgeset.badges.level(level), 
            :badgeable => badgeable
         )

      b.level_up(level) unless b.new_record?

      b.save
    end
  end
  has_many :badges, :through => :badgings
  # ....
end
1
ответ дан 6 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: