2013-08-10 2 views
1

사용자에게 속한 업데이트 모델이 있습니다. 한 사용자의 친구 '업데이트를 모두 표시하려면, 내가 좋아하는 뭔가를하고있는 중이 야 : 모델에서 메서드를 사용하여 뷰에서 호출

Update.where("user_id" => [array_of_friend_ids]) 

내가 일을 "올바른"방법을 알고 것은 위의 배열을 생성하는 방법을 만드는 것입니다. 나는 그 방법을 쓰기 시작했으나, 그것은 단지 절반 밖에 작동하지 않았다.

그럼 난 Update.where를 호출하고있어
<% @friendinsert = User.findfriends(current_user.id) %> 
<% @friendarray = [] %> 
<% @friendarray << @friendinsert %> 
<%= @friendarray.flatten! %> 

("USER_ID"=> @friendarray : 내가 함께보기에 전체 작업을하고있는 중이 야

def self.findfriends(id) 
    @friendarray = [] 
    @registered_friends = Friend.where("user_id" => id) 
    @registered_friends.each do |x| 
     @friendarray << x.friend_id 
    end 
    return @friendarray 
    end 

: 현재 내 사용자 모델이 있습니다) 작동합니다. 하지만 분명히 여기서 일을하고 있습니다. 레일스가 모델과 메소드의 특정 변수를 뷰에서 "볼 수있는"시점에 대해서는 다소 혼란 스럽습니다. 뷰 자체에서 많은 로직을 사용하지 않아야하기 때문에 ID 배열을 삽입하여 업데이트를 찾는 가장 좋은 방법은 무엇입니까?

+2

할 수 있습니다하시기 바랍니다 모델 연관을 지정 하시겠습니까? 제 생각에 당신은 협회를 정의하고 더러운 해킹 배열을 생성하지 않고 문제를 해결할 수 있다고 생각합니다 :-). – Mattherick

+0

물론 ... 현재 ... 업데이트는 사용자에 속하며 사용자는 많은 업데이트를 가질 수 있습니다. – jenno

답변

2

Mattharick은 연관성을 사용하는 것이 좋습니다. 질문에 대한 설명에서 언급 한 질문에 대한 연관성을 사용해야합니다. 우리가 당신의 질문의 제목에 질문에 올 경우;

User 모델이 있다고 가정 해 보겠습니다.

def self.testing 
    puts "I'm testing" 
end 

다른 하나는 다음과 같습니다 :이 두 가지 방법

다른있는 self 키워드

def testing 
    puts "I'm testing" 
end 

주의하십시오. self 키워드는 메소드를 Class 메소드로 만듭니다. 컨트롤러 또는 뷰에서 호출 할 수있는 값은 User.testing입니다.

하지만 테스트를 거친 인스턴스는 인스턴스 메소드입니다.

u = User.last 
u.testing 

두 번째는 당신에게 당신의 모델 내부에 '예'의 속성을 사용하는 가능성을 제공 :처럼 어느 호출 할 수 있습니다.

예를 들어, 이와 같은 방법으로 인스턴스 name을 표시 할 수 있습니까?

이것은 강력한 요소입니다.

실습.

+0

연관이 있습니다 ... 업데이트는 사용자에 속하며 사용자는 많은 업데이트를 가질 수 있습니다. 나는 그 일을하는 법을 안다. 그 사용자의 친구의 업데이트를 보여줄 수 있도록 사용자의 친구 배열을 찾으려고합니다. 위의 코드는 내가 말한 것에서 def findfriends (id)를 사용해야한다는 것입니다. def self.findfriends (id)는 첫 번째가 User의 인스턴스이고 후자가 전체 User 클래스의 것이기 때문에? – jenno

+0

많은 연관성 유형과 다양한 유스 케이스가 있다는 것을 알고 계시기 바랍니다. 예를 들어'has_many : through' 나'polymorphic' 같은 것들입니다. 귀하의 코멘트의 두 번째 부분에, 그래, 나는 그것을 언급. – scaryguy

1

단순 프로젝트에 다른 연결을 추가하십시오.

class User < ActiveRecord::Base 

    has_many :friendship 
    has_many :friends, :through => :friendship, :class_name => User, :foreign_key => :friend_id 

    has_many :friendship 
    has_many :users, :through => :friendship 

end 

class Friendship < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :friend, :class_name => User 

end 

synrax가 정확한지 모르겠다.

우정의 속성은 user_id 및 friend_id입니다.그 후

당신은 친구의 업데이트를 얻으려면 다음과 같이 뭔가를 할 수 있어야한다 :

User.last.friends.last.updates 
대신 해키 배열의 일반 액티브 레코드 쿼리로 작업 할 수 있습니다

..

+0

답변 해 주셔서 감사합니다. 저는 항상 협회를 통해 has_many와 약간 혼동했습니다. 내 문제는 어떤 모델이 어떤 속성을 필요로하는지 모른다. 예를 들어, 사용자 모델 요구 사항 (ID, 이름, 전자 메일)을 알고 있습니다. 처음에는 친구 모델에 id, user_id 및 friend_id가있었습니다. 그래서 당신이 제안하는 것은 이러한 속성 (id, userid, friendid) 대신 우정 모델을 만드는 것입니다. 그렇다면 Friend 모델의 속성은 무엇입니까? 똑같은 일은 할 수 없다 .. ..? – jenno

+0

특별한 케이스가 있습니다. 일반적으로 연관을 통한 has_many는 두 모델 사이에 있으며 세 번째 모델은 두 모델 사이에 있습니다. 귀하의 경우에는 사용자 모델 내에서만 연관을 생성합니다. 사용자는 여러 명의 친구가있을 수 있습니다. 그러나 친구도 사용자입니다. 사용자는 다른 사용자와 우정을 맺고 있습니다. 그게 내가 모델 우정이라고 부른 이유입니다. 우정 모델은 사용자와 다른 사용자 간의 모델입니다. 우정에는 user_id와 friend_id 속성이 있어야합니다. – Mattherick

+0

설명해 주셔서 감사합니다! 내 사용자 모델에 원본 답변의 코드를 추가해야한다고 생각합니다. 이 코드에서는 사용자, 친구 및 우정이라는 3 가지 모델을 보았습니다. 귀하의 코드에서 Friend 모델은 User와는 다른 이름을 부여해야하기 때문에 User의 또 다른 이름 일뿐입니다. – jenno

관련 문제