如何在视图中访问Active Record关联?

时间:2009-11-12 20:08:23

标签: ruby-on-rails activerecord

如果我有类似以下示例的模型

class Person < ActiveRecord::Base 
   has_many :moods
end 

 class Mood <ActiveRecord::Base
 end

如何更改new.html.erb让我在输入新人时选择心情?我是否需要手动将外键添加到mysql中?

3 个答案:

答案 0 :(得分:4)

如果您想要一个选择菜单,那么您正在寻找collection_select帮助器。

查看Formtastic,它可以为你的has_many生成一个不错的选择菜单。

答案 1 :(得分:1)

Rails迁移不会自动创建外键。在迁移期间必须使用类似于以下命令添加约束:

execute "alter table moods add constraint fk_moods_persons foreign key (person_id) references persons(id)"

有些插件可以自动完成这项工作并使工作更简单。很少受欢迎的是:

  1. Foreigner
  2. Redhill On Rails Core [www.railslodge.com/plugins/389-redhill-on-rails-core]
  3. 要在视图中显示,可以使用collection_select助手。

    我想habtm会是一个更好的关联(如果不止一个人可以有相同的心情。)或者has_many:通过甚至更好。

答案 2 :(得分:1)

从你提供的一些细节来看,你有点难以猜测,你想要做什么。但无论如何我会尝试:

当你希望一个人一次拥有完全一个的心情时,我会像这样建模:

class Person < ActiveRecord::Base 
  belongs_to :mood
end 

class Mood < ActiveRecord::Base
  has_many :people
end

然后,在数据库中创建people表的迁移应该包含以下语句来创建外键:

def self.up
  create_table :people do |t|
    ...
    t.references :mood
    ...
  end
end

如果这是你想要的,你可以像flyfishr64指出的那样使用collection_select命令。

在new.html.erb中的form_for标记内,您可以这样写:

<% form_for @person do |f| %>
...
<%= f.collection_select :mood_id, Mood.all, :id, :mood_name, :include_blank => "--- Choose your mood ---" %>
...
<% end %>

希望有所帮助!

然而,当你真的希望你的人同时拥有多种情绪时,这会有点复杂,我可能会建议在两种模型中使用has_and_belongs_to_many association

如果是这种情况,我建议观看这个Railscast剧集:HABTM Checkboxes。 (对不起,您必须自己查找链接,因为我不允许发布多行。请访问railscast.com并查找第17集。)