在此示例中,如何在rails中实现has

编程入门 行业动态 更新时间:2024-10-27 16:39:24
本文介绍了在此示例中,如何在rails中实现has_many:through关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我一直在寻找类似的问题,但是我仍然不知道如何实现这种关系.我当然有三种模式:

i've been searching through similar questions but i still don't get how implement this relationship. I have of course three models :

class Recetum < ActiveRecord::Base attr_accessible :name, :desc, :duration, :prep, :photo, :topic_id has_many :manifests has_many :ingredients, :through => :manifests end class Ingredient < ActiveRecord::Base attr_accessible :kcal, :name, :use, :unity has_many :manifests has_many :recetum, :through => :manifests end class Manifest < ActiveRecord::Base attr_accessible :ingredient_id, :quantity, :receta_id belongs_to :recetum accepts_nested_attributes_for :ingredient belongs_to :ingredient end

Recetum将是一个配方(脚手架时出现典型错误),该配方可能具有一种或多种成分(已经在db上).因此,当我创建新的Recetum时,我需要创建新的Recetum,并在清单中为用户输入的每种成分插入一条记录.

Recetum would be a recipe (typo when scaffolding), this recipe may have one or more ingredients (already on the db). So when i create a new Recetum, i need the new recetum to be created and one record inserted in manifest for each ingredient entered by the user.

我现在需要有关视图和控制器的帮助,如何使用成分字段创建用于recetum的表单,更重要的是我必须修改recetum控制器.

I would need some help now with views and controllers, how do i create the form for recetum with fields for the ingredients and more important what do i have to modify recetum controller.

任何建议或帮助将不胜感激,因为这部分对我的项目至关重要,在此先感谢.

Any suggestions or help would be very much appreciated as this part is crucial for my project, thanks in advance.

推荐答案

您有几个选择,主要取决于您在视图中要执行的操作.您是否要显示设定数量的max_ingredients还是完全动态的?当然,动态案例对于用户来说看起来更好,但确实会使一些更复杂的代码成为现实.

You have a couple options, and mainly they depend on what you want to do in your view. Do you want to display a set number of max_ingredients or do you want it to be completely dynamic? The dynamic case looks better for the user for sure, but it does make for some more complicated code.

这是一个很好的RailsCast,它解释了如何通过JavaScript动态地做到这一点:

Here is a good RailsCast which explains how to do it dynamically via JavaScript:

railscasts/episodes/74-complex-forms-第2部分

不幸的是,并非所有人都启用了JavaScript,因此您可能需要考虑采用静态方式.

Unfortunately, not everyone runs with JavaScript enabled so you may want to consider doing it the static way.

首先,我认为您在Manifest模型中不需要accepts_nested_attributes_for.但是,我确实认为您在Recetum模型中需要它.如果您要使用静态路线,则可能还需要设置一个reject_if选项.

Firstly, I don't think you need accepts_nested_attributes_for in your Manifest model. However, I do think you need it in your Recetum model. If you're going the static route, you'll probably want to set a reject_if option too.

accepts_nested_attributes_for :manifests, reject_if: :all_blank

执行此操作后,您需要将manifests_attributes添加到attr_accessible.

Once you do this, you'll need to add manifests_attributes to your attr_accessible.

使用静态路由,您需要预先构建一些manifests.在您的new控制器中,您将需要以下内容:

With the static route, you'll need to prebuild some of the manifests. In your new controller you'll want something like this:

max_ingredients.times do @recetum.manifests.build end

在您的edit和create和update的错误路径中,您可能想要:

In your edit and the error paths of your create and update, you may want:

(max_ingredients - @recetum.manifests.count).times do @recetum.manifests.build end

最后,您的视图将需要某种方式来设置要素.我现在假设一个选择框.

Finally, your view will need some way to set the ingredient. I'll assume a select box for now.

f.fields_for :manifests do |mf| mf.label :ingredient_id, "Ingredient" mf.collection_select :ingredient_id, Ingredient.all, :id, :name

您可能想通过列表或表添加某种格式.

You'll want to add some sort of formatting through a list or table probably.

希望这足以让您入门.

更多推荐

在此示例中,如何在rails中实现has

本文发布于:2023-10-18 06:03:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1503346.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:在此   示例   如何在   rails

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!