jenno
jenno

Reputation: 71

Using a method within model, calling it from view

I have an Update model which belongs to users. To show all of one user's friends' Updates, I am doing something like:

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

I know the "right" way of doing things is to create a method to create the above array. I started writing the method but it's only half-working. Currently I have this in my user model:

  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 

I am doing the entire action in the view with:

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

Then I'm calling Update.where("user_id" => @friendarray) which works. But obviously I'm doing things in a very hacky way here. I'm a bit confused as to when Rails can "see" certain variables from models and methods in the view. What's the best way to go about inserting an array of IDs to find their Updates, since I'm not supposed to use much logic in the view itself?

Upvotes: 1

Views: 2720

Answers (2)

Matthias
Matthias

Reputation: 4375

Simple add another association to your project.

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

I don't know if my synrax is correct, please try out.

Friendship has the attributes user_id and friend_id.

After that you should be able to do something like following to get the updates of a friend:

User.last.friends.last.updates

You can work with normal active record queries instead of hacky arrays..

Upvotes: 1

scaryguy
scaryguy

Reputation: 7940

Mattharick is right about using associations. You should use associations for the question you mentioned in description of your question. If we come to the question at the title of your question;

let's say you have a User model.

These two methods are different:

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

and the other one is:

def testing
  puts "I'm testing"
end

Pay attention to the self keyword. self keyword makes method a Class method. Which you can call it from your controllers or views like: User.testing.

But the one with out testing is a instance method. Which can be called like:

u = User.last
u.testing

Second one gives you possibility to use attributes of the 'instance' inside your model.

For example, you can show name of your instance in that method just like this?

def testing
  puts "Look, I'm showing this instance's name which is: #{name}"
end

These are powerful stuff.

Practise on them.

Upvotes: 2

Related Questions