似乎我需要了解我在rails中的关联。目前我正在尝试显示所有以部门名称为员工的帖子。
目前存在两种模式,帖子和部门
class Post < ActiveRecord::Base
belongs_to :department
attr_accessible :title, :comments, :department_id
end
class Department < ActiveRecord::Base
has_many :posts
attr_accessible :name, :post_id
#Scopes
scope :staff_posts, where(:name => "Staff")
end
所以我想显示所有具有部门名称职员的帖子
这样做我把它放在我的控制器中
class PublicPagesController < ApplicationController
def staffnews
@staffpost = Department.staff_posts
end
end
在我看来,我试图像这样显示所有这些帖子
<% @staffpost.each do |t| %>
<h2><%= t.title %>
<h2><%= t.comments %></h2>
<% end %>
显然在某个地方出错了,因为我得到了未定义的方法nil,即使我有3个帖子的名字'Staff'
有人可以解释我在哪里误解了协会,因为我很想做到这一点
修改
路线
scope :controller => :public_pages do
get "our_news"
match "our_news/staffnews" => "public_pages#staffnews"
答案 0 :(得分:4)
在控制器中,它返回名称为staff的部门。并且您在部门对象上使用标题和注释,这就是为什么它给出了nil方法错误。
像这样使用:
def staffnews
@dept_staff = Department.staff_posts
end
<% @dept_staff.each do |ds| %>
<% ds.posts.each do |p| %>
<h2><%= p.title %></h2>
<h2><%= p.comments %></h2>
<% end %>
<% end %>
或
在帖子模型中创建named_scope
class Post < ActiveRecord::Base
belongs_to :department
attr_accessible :title, :comments, :department_id
scope :staff_posts, :include => :department, :conditions => {"departments.name" => "Staff"}
end
class Department < ActiveRecord::Base
has_many :posts
attr_accessible :name, :post_id
end
控制器:
def staffnews
@staffpost = Post.staff_posts
end
查看:#No change
<% @staffpost.each do |t| %>
<h2><%= t.title %></h2>
<h2><%= t.comments %></h2>
<% end %>
答案 1 :(得分:0)
您的staff_posts
范围仅选择名为“Staff”的部门。假设您将只有一个名为staff的部门,那么您有几种方法可以解决这个问题。
这将找到所有名称为staff的部门,并急切加载随之而来的帖子:
@department = Department.where(name: "Staff").include(:posts).first
但是,由于您尝试使用Post作为范围,因此它属于Post。以下是使用方法作为范围的示例:
class Post < ActiveRecord::Base
belongs_to :department
attr_accessible :title, :comments, :department_id
def self.staff
where(department_id: staff_department_id)
end
def staff_department_id
Department.find_by_name!("Staff").id
end
end
这样,您可以使用@staff_posts = Post.staff
并迭代该集合(注意:我不建议永久地以这种方式获取staff_department_id
。这可以在应用程序启动时设置为常量,或其他一些更强大的解决方案)。
答案 2 :(得分:0)
您可以通过以下更改找到具有部门名称职员的所有帖子:
class PublicPagesController&lt; ApplicationController中
def staffnews
#get all the department which have name is staff
departments = Department.where("name=?","staff")
#get all the ids
department_ids = departments.map(&:id)
#retrieve post that department name is staff
@staffpost = Post.find_by_department_id(department_ids)
end
端