2012-09-29 2 views
3

has_and_belongs_to_many 관계가있는 사용자와 그룹이 포함 된 데이터베이스가 있습니다. 새 그룹이 추가되면 생성되지만 캐시를 지우거나 시크릿 창을 사용하여 로그인 할 때까지 그룹에 대한 사용자의 회원 자격이 전파되지 않습니다. 캐시가 지워질 때까지로드가 제대로되지 않는 것 같습니다. 이것은 최근에야 일어나기 시작했는데 그 이유를 알 수 없습니다! 어떤 도움이라도 대단히 감사하겠습니다. 모델에서레일 - 캐시를 지울 때까지 새 데이터로보기가 업데이트되지 않습니다.

:

class User < ActiveRecord::Base 
    has_many :services 
    has_many :recipes 
    has_and_belongs_to_many :groups 
    attr_accessible :recipes, :groups 
end 

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    has_many :recipes 
    attr_accessible :description, :title, :recipe, :picture, :featured, :user_id 
end 

그룹 만들기 방법 :

def create 
    @user = User.find(current_user.id) 
    @group = Group.new(params[:group]) 
    @group.user_id = @user.id 
    @user.groups << @group 

    redirect_to group_path(@group) 
    end 

사용자의 그룹 구성원을 표시 - 캐시가 지워질 때까지이 업데이트되지 않습니다 :

<% @user.groups.each do |group| %> 
<% if group %> 
    <p class="group-title"><a href="<%= group_path(group) %>"><%= group.title %></p> 
     <% @latestpic = Recipe.where("group_id = ?", group).limit(1).order("created_at DESC") %> 
     <% if @latestpic.exists? %> 
      <% @latestpic.each do |pic| %> 
       <%= image_tag(pic.picture.url(:medium)) %> 
      <% end %></a> 
     <% else %> 
      <%= image_tag "http://placehold.it/300x300" %> 
     <% end %> 
     <br></br> 

<% end %> 
<% end %> 
+0

@AdamEberlin - 난 레일 멍청 아. 내가 어떻게 확인할 수 있니? – Kim

+0

RAILS 응용 프로그램을 제공하기 위해 RAILS 독립형 서버 또는 다른 서비스를 사용하고 있습니까? 그리고 어떤 운영 체제입니까? –

+0

@AdamEberlin - 씬 웹 서버 (Chrome1.4.1 코드 명)를 사용하고 있습니다. 나는 Mac OS에있다. 이 문제는 Heroku에서 호스팅 될 때 로컬에서 발생합니다. – Kim

답변

0

당신의 모델에는 "가지고 있고 많은 것"관계가 있습니다. 즉, 사용자가 n gro에있을 수 있음을 의미합니다 귀하의 그룹에는 n 명의 사용자가 있습니다.

@group.user_id 

"그룹"테이블에 user_id 열을 만든 경우 그룹에 n 명의 사용자가 포함되어 있기 때문에 삭제할 수 있습니다. 나는 아래처럼

create_table :group_users, :id => false do |t| 
    t.references :group, :null => false 
    t.references :user, :null => false 
end 

그런 다음 컨트롤러를 리팩토링 :

def create 
    @group = current_user.groups.build(params[:group]) 

    if @group.save 
    redirect_to @group, notice: 'Group was successfully created.' 
    else 
    render action: "new" 
    end 
end 

이 거기에 현재 사용자와 그룹을 만들 것입니다 당신은 다음과 같이 사용자와 그룹 사이에 테이블을 사용합니다. 귀하의 방법에서 수정 사항을 저장하는 것을 잊었습니다. 연산자 = 및 < <은 데이터베이스를 업데이트하지 않기 때문입니다. 그렇다면 나는 약간의 리팩토링을했지만, 같은 논리입니다.

보기에서 많은 것을 리펙토링 할 수도 있지만 문제는 아닙니다. 그대로 두겠습니다.

이제 작동합니까?

0

이 대답은 오래된 될 수 있지만 종료 - 여기까지 Google 직원 유용 할 수 있습니다 :

가지고 앤 속한다-to-many 연관, 그것은 변화를 레일 (나를 위해 4.2) 업데이트하지 않습니다 루트 레코드의 값은 updated_at입니다. 예 :

# This does not change @user.updated_at value 
@user.update_attributes(group_ids: [1, 2, 3]) 

모든 액티브 오브젝트는 일반적으로 updated_at의 가치와 캐시 무효화를 사용하여 구축 특별한 cache_key 그 기반으로있다. 따라서 HABT 만 변경하면 캐시가 무효화되지 않습니다.

가능한 해결책은 HABTM이 변경된 경우 수동으로 @user.touch으로 전화하는 것입니다.

관련 문제