Мое приложение - это база знаний, описывающая бизнес-правила на нескольких языках.Переводы имени и описания оформляются как вложенные атрибуты.Их нет в основной таблице, только в таблице переводов:
id :integer not null, primary key
field_name :string(30) not null
language :string(2) not null
translation :text
created_at :datetime not null
updated_at :datetime not null
Бизнес-правила могут иметь много переводов, как указано в модели:
has_many :name_translations, -> { where("field_name='name'") }, class_name: 'Translation'
has_many :description_translations, -> { where("field_name='description'") }, class_name: 'Translation'
При создании яинициализируйте эти переводы в контроллере бизнес-правил:
def new
@business_rule = BusinessRule.new
@business_rule.name_translations.build(language: user_language, field_name: 'name')
@business_rule.name_translations.build(language: user_language, field_name: 'description')
end
В файле _form.html.rb я хочу отображать только перевод для языка текущего пользователя.Конечно, при создании правила доступен только один язык, но поскольку я использую ту же форму для обновления, мне нужно отфильтровать вложенные переводы и сохранить только язык текущего пользователя:
<div class="row">
<div class="col-md-1 text-right"> <%= t('Name')%>:
</div>
<%= f.fields_for :name_translations, @business_rule.name_translations.where('language=?', user_language) do |naming| %>
<div class="col-md-8">
<%= naming.text_field :translation, :class => "col-md-10" %>
</div>
<div class="col-md-1">
<%= naming.hidden_field :field_name, :value => 'name' %>
</div>
<div class="col-md-1">
<%= naming.hidden_field :language, :value => user_language %>
</div>
<% end %>
</div>
Это прекрасно работает дляредактирование существующего бизнес-правила.Но для создания бизнес-правила вложенное поле не отображается.
Если я удаляю выражение
@business_rule.name_translations.where ('language =?', User_language)
, отображается поле ввода,Но это не соответствует требованию редактирования, потому что также показаны все переводы.
Я подозреваю, что это выражение запрашивает вложенные атрибуты из базы данных, а не те, которые инициализируются методом new вконтроллер.
Есть ли способ избежать этого или отфильтровать : name_translations , переданный методу fields_for ?
Спасибо заваша помощь!