Таким образом, ваша модель данных, похоже, подходит к тому моменту, когда вы, по крайней мере, захотите разделить торговцев. Вы можете узнать это из запроса «DISTINCT Merchant». Если ваши продавцы основаны на вводе данных пользователем и сохраняются в таблице продуктов, кажется, что сейчас самое время перенести их в свою собственную модель, чтобы их можно было легко находить и контролировать. По мере того, как вы будете получать больше продавцов и больше продуктов, выполнять этот запрос будет все сложнее и сложнее. Как только вы захотите добавить дополнительную информацию о продавце, вы также окажетесь в худшем положении. Просто имейте в виду, что Rails создан для легкого рефакторинга. Внесение этого изменения не должно быть пугающим, оно должно быть просто очередной обычной задачей в вашем процессе гибкой разработки.
То, что вышеупомянутое изменение также позволит вам сделать, это изменить эти строки:
@products = Product.find(:all, :conditions => ['merchant = ?', params[:merchant]])
@merchant = params[:merchant].capitalize.gsub('-',' ')
в
@merchant = Merchant.find_by_name(params[:name])
@products = @merchant.products
После этого вы можете использовать имя с заглавной буквы и имя gsub с помощью функции модели:
@merchant.display_name
Следующим шагом будет немного подсушить код вашей модели, например:
class Product
def brand_name
make_name brand
end
def category_name
make_name category
end
def merchant_name
make_name merchant
end
private
def make_name name
name.capitalize.gsub('-', ' ')
end
end
Вы можете сделать что-то похожее на функции _url. Если вы хотите пойти дальше, вы можете очистить это с помощью метапрограммирования.
Заключительные мысли: убедитесь, что вы действительно хотите вызывать html_safe в своих строках. Если они вводятся пользователем, лучше всего позволить им пройти через функцию h в ваших представлениях. Хотите ли вы, чтобы пользователи могли вводить строки HTML как бренды, продавцы и категории? Если это так, то оставьте там строку html_safe, в противном случае пусть строки будут сделаны html_safe в ваших представлениях.
В общем, вы на правильном пути: тощие контроллеры, представления и толстые модели - это путь. Это означает, что ваша логика и ваш тяжелый подъем в ваших моделях и пусть ваши контроллеры и представления будут маленькими и простыми.