0

私はこれに苦労しています。実装の直接的な問題ではありませんが、どちらが正しい方法なのかわかりません.2つのオプションがありますが、最初に、これらは私のモデルです:

class Boat < ActiveRecord::Base
  validates :name, presence: true, uniqueness: { case_sensitive: false }

  has_many :tech_specs, order: 'position'

  def visible?
    self.visible
  end
end

class TechSpec < ActiveRecord::Base
  validates :boat_id, presence: true
  validates :tech_spec_name_id, presence: true, uniqueness: { scope: :boat_id }

  belongs_to :boat
  belongs_to :tech_spec_name

  before_destroy :destroy_name_if_required

  acts_as_list scope: :boat

  def as_json(options = {})
    super(options.except!(:tech_spec_name_id).merge!(methods: [self.name]))
  end

  def name
    self.tech_spec_name.try(:name) || ''
  end

  def name=(value)
    self.tech_spec_name = TechSpecName.find_or_create_by_name(value)
  end

  def destroy_name_if_required
    self.tech_spec_name.destroy if self.tech_spec_name.tech_specs.size <= 1
  end
end

class TechSpecName < ActiveRecord::Base
  validates :name, presence: true, uniqueness: { case_sensitive: false }

  has_many :tech_specs

  def self.with_name_like(str)
    where('lower(name) LIKE lower(?)', "%#{ str }%")
  end
end

問題は、あるロケールではいくつかの技術仕様を表示し、別のロケールでは他の技術仕様を表示するボートのページが必要なことです。

アイデア#1

私の基本的なアイデアは、tech_spec.value とフィールド tech_spec_name.nameTechSpecに globalize3を追加することです。TechSpecName

アイデア#2

もう 1 つのアイデアは、TechSpecName を削除し、代わりに TechSpecName を完全に「置き換える」フィールド (tech_spec.name) を使用することです。この場合、オートコンプリートのために名前をフェッチする必要がありますが、TechSpecName からすべてをフェッチするのではなく、TechSpec でフィルタリングします。このフィールドは明らかにglobalize3を再び使用します。

両方のアプローチの欠点がわからないので、提案が必要です。

4

1 に答える 1

0

アイデア #1 は問題ないようです。これは正しく機能し、Db 内で繰り返されるテキストの量を減らします。

I18n.with_localeとても役に立ちます、またGlobalize.with_locale役に立ちます

于 2013-02-27T23:19:06.733 に答える