Можно использовать встроенный firebird, это - просто dll, что необходимо будет поставить с Вами приложение.
О вещах, являющихся недокументированным, это не действительно верно, firebird драйвер.NET реализует Интерфейсы ADO, поэтому если Вы знаете ADO, можно работать с Firebird, в основном вместо SQLConnection, Вы будете использовать FBConnection и так далее, но мой совет состоит в том, чтобы записать уровень доступа к данным, и использование просто взаимодействует через интерфейс на Вашем коде, чем-то вроде этого:
using FirebirdSql.Data.FirebirdClient;
public static IDbConnection MyConnection()
{
FbConnection cn = new FbConnection("...");
return cn;
}
Этот пример очень прост, но Вам не будет нужно намного больше, чем это.
Мы используем firebird для нашего всего приложения без любых проблем, необходимо, по крайней мере, испытать его.
Похоже, будет лучше, если вы разделите значок на две модели. Вот как я бы разбил его, чтобы достичь желаемой функциональности. Я добавил несколько именованных областей видимости, чтобы сохранить код, который действительно делает вещи чистыми.
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