【问题标题】:How can I take advantage of my model associations in my view and controller in Ruby on Rails 3?如何在 Ruby on Rails 3 的视图和控制器中利用模型关联?
【发布时间】:2011-05-10 02:01:08
【问题描述】:

我是 Rails 新手,正在尝试设置我的模型,想知道 Rails 如何处理关联。

我有一个 Quest 对象,它“belongs_to”或通过外键引用许多其他对象,包括用户和内容:

quest.user_id  
quest.a_different_name_id  #this is a foreign key to a Content object

这些都是分别引用用户对象和内容对象的外键。

用户和内容“has_many”任务。

我了解此设置允许我执行以下操作:

u = User.create #saves to database  
u.quests.build  #creates new Quest object with user id set to u.id  

我可以做一些相反的事情吗:

form_for @quest do |f|
    f.text_field :a_user_attribute            #an attribute of a User object
    f.text_field :a_different_name_attribute  #an attribute of a Content object

其中表单包含 Quest 对象通过其外键引用的对象属性的文本字段,而不是具有实际外键的表单,因此在控制器中时我有:

@quest = Quest.new(params[:quest])

Rails 是否足够聪明,可以“通过”模型定义的外键关系并填充并保存 User 和 Content 对象,并在 @quest 中适当地设置外键以引用新创建的对象?

即使 Content 对象的外键名称与 content_id 不同,它也能做到这一点吗?

希望这是有道理的...如果我不清楚,请告诉我。

【问题讨论】:

    标签: ruby-on-rails controller associations foreign-key-relationship


    【解决方案1】:

    您可以使用 Rails http://guides.rubyonrails.org/2_3_release_notes.html#nested-attributes 中的嵌套属性功能做您需要的事情

    在此处查看表单助手 http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

    基本上你需要做以下事情:

    class User < ActiveRecord::Base
      has_many :quests
      accepts_nested_attributes_for :quests
      ...
    end
    
    class Quest < ActiveRecord::Base
      belongs_to :user
      ...
    end
    

    然后在表单中执行以下操作:

    <%= form_for @user do |f| %>
      UserAttrA  : <%= f.text_field :a_user_attribute_a %>
      UserAttrB: <%= f.text_field :a_user_attribute_b %>
      <%= f.fields_for :quests do |qf| %>
        QuestAttrA  : <%= qf.text_field :a_quest_attribute_a %>
        QuestAttrB: <%= qf.text_field :a_quest_attribute_b %>
      <% end %>
      UserAttrC  : <%= f.text_field :a_user_attribute_c %>
      UserAttrD: <%= f.text_field :a_user_attribute_d %>
    <% end %>
    

    你的控制器会像上面那样工作。

    请注意,您可以在 Quest 输入之前和/或之后显示用户输入。基本上,您可以使视图中的表单看起来像您想要的那样。但是服务器上的语义需要保持一致。

    【讨论】:

    • 感谢您的回复。您提供的链接中的示例都与 has_many 或 has_one 的关系相反,而不是 belongs_to。看起来 Rails 不会让你以另一种方式来做......还是我错过了什么?
    • 从语义上讲,您希望创建的表单是 has_one 用户,因此您可能应该将该关联添加到模型中。 (我已经修改了我上面的例子)。但这样做不应影响应用程序中其他任何地方的任何代码或数据。 stackoverflow.com/questions/2136091/…
    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2019-12-17
    • 2011-12-28
    相关资源
    最近更新 更多