在我的应用程序中,我创建了两个模型教程和教程类别,对于教程,我已经为类别(在迁移中)'tutorialcategory'创建了一个字符串字段。
在教程添加页面上,我添加了一个选择框字段来选择类别,它正确保存(我希望),因为我可以在显示页面中保存教程后看到该值。但是当我看到使用json渲染的完整列表时,我看不到那里的值。
注意:两个模型都是独立的,其中没有一个包含迁移中的参考字段
模型代码如下
class Tutorialcategory < ActiveRecord::Base
attr_accessible :title
def to_param
"#{id}-#{title}"
end
end
class Tutorial < ActiveRecord::Base
attr_accessible :body, :projectcategory, :rating, :title, :tutorialcategory, :videoid
end
答案 0 :(得分:3)
您似乎需要在has_many
和Category
之间建立Tutorial
关系:
删除教程表中名为“tutorialcategory”的字符串字段,创建一个名为tutorial_category_id的字段(按惯例),该字段将引用TutorialCategory的ID。
在模型中,设置has_many / belongs_to关联:
class Tutorialcategory < ActiveRecord::Base
has_many :tutorials
end
class Tutorial < ActiveRecord::Base
belongs_to :tutorial_category
end
然后您可以访问tuto.tutorial_category
(tuto是教程的实例),categ.tutorials
(Categ是类别的实例)
当然,您需要重做界面以通过其ID保存教程类别。
文档:
答案 1 :(得分:2)
要添加到Caillou
的答案,您还需要其他一些修补程序。
<强>驼峰强>
您的Tutorialcategory
模型需要调用TutorialCategory
:
#app/models/tutorial_category.rb
class TutorialCategory < ActiveRecord::Base
...
end
每当Rails加载模型时,它的名称都应为CamelCase
。它会从snake_case
文件名中推断出来;每个下划线代表一个新的大写字母。
-
查看强>
要通过category
关系填充has_many
,您需要填充关联表格的foreign_key
:
#app/views/tutorials/new.html.erb
<%= form_for @tutorial do |f| %>
<%= f.collection_select :category_id, TutorialCategory.all, :id, :name %>
<%= f.submit %>
<% end %>
这将设置数据库中category_id
对象的Tutorial
- 在调用它时填充tutorial_category
关联方法:
#app/models/tutorial.rb
class Tutorial < ActiveRecord::Base
belongs_to :category, class_name: "TutorialCategory" #-> put category_id in the tutorials table
end
#app/models/tutorial_category.rb
class TutorialCategory < ActiveRecord::Base
has_many :tutorials #-> no changed needed in db
end
这是ActiveRecord从相关表中提取关联对象的方式:
@tutorial = Tutorial.find x
@tutorial.category.name #-> name of category
-
<强>别名强>
要阻止law of demeter,您可以使用alias_attribute
将name
委托给category
:
#app/models/tutorial.rb
class Tutorial < ActiveRecord::Base
...
alias_attribute :name, to: :category, prefix: true #-> @tutorial.category_name
end
-
强大的参数
最后,当您升级到Rails 4时,您需要在控制器中使用strong parameters。这是一个非常简单的开关:
attr_accessible
像这样:
#app/controllers/tutorials_controller.rb
class TutorialsController < ApplicationController
def create
@tutorial = Tutorial.new tutorial_params
@tutorial.save
end
private
def tutorial_params
params.require(:tutorial).permit(:body, :title, :tutorialcategory)
end
end