В ответ на ваш вопрос, чтобы помочь сделать код чище:
def create
@rating = Rating.new(params[:rating])
@rating.user = curent_user
@rating.programme = Programme.find_or_create_by_title(params[:programme])
@rating.save
redirect_to ratings_path
end
Прежде всего, вы вызываете find_or_create для заголовка, а затем сохраняете его, но запись там уже будет создана, поэтому сохранение вообще ничего не делает. Во-вторых, несмотря на то, что прокси-серверы ассоциаций хороши для легкого создания связанных объектов, они могут стать довольно сложными в более сложных отношениях, как у вас здесь, и затруднить чтение кода.
Таким образом, вместо использования прокси ассоциаций для создания записей, прямое назначение было бы лучше. Проще с первого взгляда точно определить, что происходит и откуда поступает информация, и не нуждается в ужасном слиянии. Это немного дольше, но я думаю, что это гораздо легче понять с первого взгляда.
Наконец, вам, вероятно, не нужна @programme
как отдельная переменная экземпляра, поскольку у вас будет легкий доступ к этому объекту из @rating.programme
в ваших представлениях. В большинстве случаев лучше передавать как можно меньше переменных экземпляра, особенно когда объекты имеют легкодоступные прямые отношения. Это особенно актуально в этом случае, потому что вы вообще не рендерите шаблон.