模型has_many OtherModel但是已本地化,因此基于locale的同一Model的不同OtherModel:如何?

时间:2013-02-24 22:20:42

标签: ruby-on-rails internationalization ruby-on-rails-3.2 globalize3

我很难用这个,这不是一个直接的实现问题,但我不明白哪个是正确的方法,我有两个选择,但首先,这些是我的模型:

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和TechSpec上添加TechSpecName globalize3 for field tech_spec_name.name

创意#2

另一个想法是删除TechSpecName,而是使用将完全“替换”TechSpecName的字段(tech_spec.name)。请注意,在这种情况下,我仍然需要获取自动完成的名称,但我会在TechSpec中过滤它们,而不是从TechSpecName中获取所有名称。该字段将再次使用globalize3。

我不知道这两种方法的缺点,所以我需要一个建议。

1 个答案:

答案 0 :(得分:0)

似乎想法#1没问题,它可以正常工作并减少Db中重复文本的数量。

I18n.with_locale也有很大帮助,Globalize.with_locale也很有帮助