私はこれに苦労しています。実装の直接的な問題ではありませんが、どちらが正しい方法なのかわかりません.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を再び使用します。
両方のアプローチの欠点がわからないので、提案が必要です。