如果我有类似以下示例的模型
class Person < ActiveRecord::Base
has_many :moods
end
class Mood <ActiveRecord::Base
end
如何更改new.html.erb让我在输入新人时选择心情?我是否需要手动将外键添加到mysql中?
答案 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)"
有些插件可以自动完成这项工作并使工作更简单。很少受欢迎的是:
要在视图中显示,可以使用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集。)