2015-01-10 4 views
0

내 앱에는 그룹스에 속해 있으며 게시물을 작성할 수있는 사용자가 있습니다.레일에 그룹별로 게시물을 가져 오기

각 그룹 페이지에서 해당 그룹의 모든 게시물 (가장 오래된 것부터 가장 오래된 것)을 표시하려고합니다. 이것은 지금까지 시도한 코드이지만 사용자가 속한 그룹에 관계없이 모든 사용자가 모든 게시물을 표시합니다.

class GroupsController < ApplicationController 
    def show 
    @group = Group.find(params[:id]) 
    if logged_in? 
     @feed_items = Post.latest_posts_by_group(@group) 
    end 
    end 
end 

그리고 post.rb에 : 여기

groups_controller.rb

class Post < ActiveRecord::Base 
    belongs_to :user 

    def self.latest_posts_by_group(group_id) 
    Post.find_by_sql(['select posts.* 
     from groups 
     inner join users 
     on users.group_id = groups.id 
     inner join posts 
     on posts.user_id = user_id 
     where groups.id = ? 
     order by created_at desc', group_id]) 
    end 
end 

user.rb (물론, 적어도 협회) : 다시

class User < ActiveRecord::Base 
    belongs_to :group 
    has_many :posts 
end 

group.rb가 (단지를 보여주는 협회) :

class Group < ActiveRecord::Base 
    has_many :users 
end 
+0

당신이 모델 사이의 관계를 공유 할 수 있습니다 더 참고로

? – vee

답변

2

SQL 쿼리를 수동으로 생성하는 대신 연결 도우미에 내장 된 레일을 사용합니다. 올바르게 이러한 연결을 구성 할 때이 경우

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_one :group, through: :user 

class User < ActiveRecord::Base 
    belongs_to :group 
    has_many :posts 

class Group < ActiveRecord::Base 
    has_many :users 
    has_many :posts, through: :users 

, 레일은 자동으로 당신을 위해 @group.posts 같은 방법을 생성합니다.

당신은주의해야한다

, 외부 키는 협회가 작동하려면 특정 방법이라는하지만 SQL 쿼리에서 난 당신이 이미 수행 한 것을 볼 수있다 그러나 것을 당신의 Users에 외래 키를 group_iduser_id 이름을 지정하여 테이블은 각각 ​​Posts입니다. http://edgeguides.rubyonrails.org/association_basics.html#the-has-many-through-association

+0

내가 이것을 시도했을 때, 그것은 나에게 다음과 같은 오류를 주었다 : "협회를 발견 할 수 없었다 : 모델 그룹의 사용자"... 어떤 생각? – Andrew

+0

죄송합니다. 그룹에 'has_many : users'를 추가해야합니다. 나는 지금 그것을 편집 할 것이다.그리고'belongs_to : group, through : : user'을'has_one'에 올리면서, @Hiasinho를 붙잡아 주셔서 감사합니다. – cm92

+0

훌륭합니다. Hiasinho가 주창 한 범위 방법보다 빠르고 효율적입니까? – Andrew

1

범위로이를 수행 할 수 있습니다. :user 협회에 가입하고 users.group.id에 조건을 입력하십시오. 다음 코드는이를 수행해야합니다.

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_one :group, through: :user 

    scope :latest_posts_by_group, ->(group) { 
    joins(:user). 
    where(users: {group_id: group.id}). 
    reorder(created_at: :desc) 
    } 
end 

이이 같은 SQL을 생성합니다

당신이 원하는 경우
SELECT posts.* FROM posts 
    INNER JOIN users ON users.id = posts.user_id 
WHERE users.group_id = ? 
ORDER BY posts.created_at DESC 

, 당신은 또한 계정에 groups 테이블을 취할 수 있습니다. 그러나 테이블에 group_id이 있으니 필요하지 않습니다.

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_one :group, through: :user 

    scope :latest_posts_by_group, ->(group) { 
    joins(:group). 
    where(groups: {id: group.id}). 
    reorder(created_at: :desc) 
    } 
end 

이이 같은 SQL을 생성합니다

SELECT posts.* FROM posts 
    INNER JOIN users ON users.id = posts.user_id 
    INNER JOIN groups ON groups.id = users.group_id 
WHERE groups.id = ? 
ORDER BY posts.created_at DESC 

더 자세한 내용은 Rails Guides에서보세요.

+0

고마워요 @Hiasinho! 첫 번째 제안을 약간 변경하면 작동합니다. 나는 범위 : latest_posts_by_group, -> (그룹) {조인 (: 사용자) .where (사용자 : {그룹 ID : group.id}) reorder ('created_at desc')}'를 사용했습니다. 나는 둘 다 일했고 매우 도움이 되었기 때문에 한 번 이상 대답을 받아 들일 수 있었으면 좋겠다. – Andrew

관련 문제