2013-08-10 2 views
1

У меня есть модель обновления, которая принадлежит пользователям. Чтобы показать все обновления друзей одного пользователя, я делаю что-то вроде:Использование метода в модели, вызывающего его из вида

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

Я знаю, что „правильный“ способ делать вещи, чтобы создать метод для создания выше массива. Я начал писать этот метод, но он работает только наполовину. В настоящее время у меня есть это в моей модели пользователя:

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 

Я делаю все действия в окне с:

<% @friendinsert = User.findfriends(current_user.id) %> 
<% @friendarray = [] %> 
<% @friendarray << @friendinsert %> 
<%= @friendarray.flatten! %> 

Тогда я звоню Update.where («user_id» => @friendarray), который работает. Но, очевидно, я делаю это очень грубо. Я немного смущен, когда Rails может «видеть» определенные переменные из моделей и методов в представлении. Каков наилучший способ вставить массив идентификаторов, чтобы найти их обновления, так как я не должен использовать много логики в самом представлении?

+2

Можете ли вы пожалуйста укажите свои ассоциации моделей? Я думаю, вы могли бы решить свою проблему путем определения ассоциаций, а не путем создания грязных хакерских массивов :-). – Mattherick

+0

Уверен ... Это в настоящее время ... Обновления принадлежат пользователю, а Пользователь может иметь много обновлений. – jenno

ответ

2

Mattharick прав насчет использования ассоциаций. Вы должны использовать ассоциации для вопроса, упомянутого в описании вашего вопроса. Если мы подошли к вопросу по названию вашего вопроса;

скажем, у вас есть модель User.

Эти два метода отличаются:

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

, а другой является:

def testing 
    puts "I'm testing" 
end 

Обратите внимание на ключевое слово self. self ключевое слово делает метод методом класса. Который вы можете назвать это от ваших контроллеров или просмотров, например: 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 

Я не знаю, соответствует ли мой синакс, попробуйте.

Дружба имеет атрибуты user_id и friend_id.

После того, что вы должны быть в состоянии сделать что-то вроде следующих, чтобы получить обновления другу:

User.last.friends.last.updates 

Вы можете работать с нормальной активной записи запросов вместо Hacky массивов ..

+0

Спасибо за ваш ответ. Я всегда был немного смущен ассоциациями has_many. Моя проблема в том, что я не знаю, какие модели нужны, какие атрибуты. Например, я знаю, что мне нужна моя модель: id, name, email. В начале моя модель Friends имела: id, user_id и friend_id. Итак, что вы предлагаете, это создать модель дружбы вместо этих атрибутов (id, userid, friendid)? Тогда каковы были бы атрибуты для модели Friend? Это не может быть одно и то же ...? – jenno

+0

У вас есть специальный чехол. Обычно связь has_many между двумя моделями, с третьей моделью между ними. В вашем случае вы создаете ассоциацию только в пользовательской модели. У пользователя может быть несколько друзей. Но друг тоже пользователь. У пользователя есть дружба с другим пользователем. Вот почему я назвал модельную дружбу. Модель дружбы - это модель между пользователем и другим пользователем. Дружба должна проста иметь атрибуты user_id и friend_id. – Mattherick

+0

Спасибо за разъяснение! Я понимаю, что я должен добавить ваш код в исходный ответ на мою модель пользователя. В этом коде я вижу 3 модели: пользователь, друзья и дружба. В вашем коде, правильно ли сказать, что модель Friend - это просто другое имя для пользователя, потому что нам нужно дать ему другое имя от пользователя? – jenno

Смежные вопросы