Finding users in a group returned query

I’m relatively new to rails and am setting up a system which contains
bands and users. Both bands and users has and belongs to many of the
other.

In the bands “show” view, I want to list all the users within a band.
I do this by using the code:

<% for user in @band.users %>

and iterating through the results.

However, I want to display a special div if the current user’s id
(stored in the session variabel “@current_user.id”) is within the
returned results. I have unsuccessfully tried doing the following:

<% for user in @band.users %>

Member name:<%=h user.login %>

<% if user.user_id == @current_user.id %>
DISPLAY SPECIAL DIV
<% end %>

<% end %>

I can’t understand why this isn’t working. Can anyone advise me on
this?

On Jul 17, 3:10 pm, Gearóid O’Ceallaigh [email protected] wrote:

    <% if user.user_id == @current_user.id %>
    *DISPLAY SPECIAL DIV*
    <% end %>

<% end %>

I can’t understand why this isn’t working. Can anyone advise me on
this?

I think you mean this instead?

if user.id == @current_user.id

(instead of user.user_id == …)

Jeff

purpleworkshops.om

the line

<% if user.user_id == @current_user.id %>

should be

<% if user.id == @current_user.id %>

Maybe you’re storing the user_id within session[:user_id]?

session[:user_id] == user.id

On 18 Jul 2008, at 23:42, Gearóid O’Ceallaigh wrote:

I think my relationships may be set up incorrectly but I’m not sure
why. I guess I’d be best to give a bit of background.

If you thing that’s the case, then maybe showing us how you’re setting
them up would enlighten everyone.

Fred

I think my relationships may be set up incorrectly but I’m not sure
why. I guess I’d be best to give a bit of background.

I’m setting up a musicians network for my local area. There are bands
and users as described above, and these are linked with the table
“bands_users” which has three fields: id, band_id, and user_id. I am
also working off the Beast forum so I thought it would be as easy to
use their user table and configuration since its already set up.

So, what I find strange is that, when I want to return the user id
like above, I must use “user.user_id”. I believe I should be able to
simply state user.id but doing so returns the value from “id” (note:
NOT user_id - just the unique id from the bands_users table).

I also have a similar relationship set up between bands and gigs, but
this works as desired.

Does anyone have any ideas why this would be messing up? Would the
fact that I’m taking the data from the Beast Forum’s users be causing
problems. Any help, as ever, is appreciated.

If its enlightenment you seek, then I’d suggest reading the entire
post. Regardless, here is the code if you couldn’t figure it out:

band.rb


class Band < ActiveRecord::Base
has_and_belongs_to_many :gigs
has_and_belongs_to_many :users

def self.get_bands
find (:all, :order => ‘band_name’)
end

end

user.rb


class User < ActiveRecord::Base
has_and_belongs_to_many :bands

def self.per_page
50
end

has_many :moderatorships, :dependent => :destroy
has_many :forums, :through => :moderatorships, :order =>
“#{Forum.table_name}.name”

has_many :posts
has_many :topics
has_many :monitorships
has_many :monitored_topics, :through => :monitorships, :conditions
=> [“#{Monitorship.table_name}.active = ?”, true], :order =>
“#{Topic.table_name}.replied_at desc”, :source => :topic

validates_presence_of :login, :email
validates_length_of :login, :minimum => 2

with_options :if => :password_required? do |u|
u.validates_presence_of :password_hash
u.validates_length_of :password, :minimum => 5, :allow_nil
=> true
u.validates_confirmation_of :password, :on => :create
u.validates_confirmation_of :password, :on => :update, :allow_nil
=> true
end

names that start with #s really upset me for some reason

validates_format_of :login, :with => /^[a-z]{2}(?:\w+)?$/i

names that start with #s really upset me for some reason

validates_format_of :display_name, :with => /^[a-z]{2}(?:[.'-
\w ]+)?$/i, :allow_nil => true

validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+.)+
[a-z]{2,})$/i, :message => “Please check the e-mail
address”[:check_email_message]

validates_uniqueness_of :email
validates_uniqueness_of :login, :case_sensitive => false
validates_uniqueness_of :display_name, :openid_url, :case_sensitive
=> false, :allow_nil => true
before_validation { |u| u.display_name = u.login if
u.display_name.blank? }

first user becomes admin automatically

before_create { |u| u.admin = u.activated = true if User.count ==
0 }
before_save { |u| u.email.downcase! if u.email }
format_attribute :bio

attr_reader :password

attr_protected :admin, :posts_count, :login, :created_at, :updated_at,
:last_login_at, :topics_count, :activated

def self.currently_online
User.find(:all, :conditions => [“last_seen_at > ?”,
Time.now.utc-5.minutes])
end

we allow false to be passed in so a failed login can check

for an inactive account to show a different error

def self.authenticate(login, password, activated=true)
find_by_login_and_password_hash_and_activated(login,
Digest::SHA1.hexdigest(password + PASSWORD_SALT), activated)
end

def self.search(query, options = {})
with_scope :find => { :conditions =>
build_search_conditions(query) } do
options[:page] ||= nil
paginate options
end
end

def self.build_search_conditions(query)
query && [‘LOWER(display_name) LIKE :q OR LOWER(login) LIKE :q’,
{:q => “%#{query}%”}]
end

def password=(value)
return if value.blank?
write_attribute :password_hash, Digest::SHA1.hexdigest(value +
PASSWORD_SALT)
@password = value
end

def openid_url=(value)
write_attribute :openid_url, value.blank? ? nil :
OpenIdAuthentication.normalize_url(value)
end

def reset_login_key(rehash = true)
# this is not currently honored
self.login_key_expires_at = Time.now.utc+1.year
self.login_key = Digest::SHA1.hexdigest(Time.now.to_s +
password_hash.to_s + rand(123456789).to_s).to_s if rehash
end

def reset_login_key!(rehash = true)
reset_login_key(rehash)
save!
login_key
end

def active_login_key
reset_login_key!(login_key.blank?)
end

def moderator_of?(forum)
moderatorships.count(“#{Moderatorship.table_name}.id”, :conditions
=> [‘forum_id = ?’, (forum.is_a?(Forum) ? forum.id : forum)]) == 1
end

def to_xml(options = {})
options[:except] ||= []
options[:except] << :email << :login_key << :login_key_expires_at
<< :password_hash << :openid_url << :activated << :admin
super
end

def password_required?
openid_url.nil?
end

def update_posts_count
self.class.update_posts_count id
end

def self.update_posts_count(id)
User.update_all [‘posts_count = ?’, Post.count(:id, :conditions =>
{:user_id => id})], [‘id = ?’, id]
end
end

On Jul 19, 12:17 am, Frederick C. [email protected]

You have only one has and belongs to many relationship as shown below:

has_and_belongs_to_many :bands

Both Obie F. in his Rails Way and Ryan B. in his
ActiveRecords screen-cast Episode 1 suggest to use “has many through”
associations instead since it is much more flexible. I do not have a
lot of experience with Rails but have generally avoided using has and
belongs to many due to its restrictive nature. You already are using
has many through without any problems right?

Hope this helps.

Bharat

On 20 Jul 2008, at 19:04, Gearóid O’Ceallaigh wrote:

If its enlightenment you seek, then I’d suggest reading the entire
post. Regardless, here is the code if you couldn’t figure it out:

Shot in the dark: does your join table between bands and users have an
id column ? It shouldn’t. If rails is just doing a select * then the
id from the join table could easily clobber the id from the users table.

Fred

On Jul 27, 12:59 pm, Gearóid O’Ceallaigh [email protected] wrote:

end

end

Is there way of simply checking if the collection of users in
@band.users contains the current user’s id without having to loop
through them?

This returns the user object if it exists:

@band.users.find_by_id(@current_user.id)

It will return nil if the user is not part of the band not found.

Does this help?

Jeff
purpleworkshops.com

That works perfectly - Thanks a lot!!

Its begun to work now (added an else statement) but thanks for the
advice anyway.

What I’d like to is to perform a check to see if a user is in a band
within a controller. I presume I should put something along the
following in the bands controller:

def is_member_in_band
return if admin?
for user in @band.users
if user.id == @current_user.id
return true
end
end
end

Is there way of simply checking if the collection of users in
@band.users contains the current user’s id without having to loop
through them?

Thanks to everyone who’s replied so far.

On Jul 20, 7:33 pm, Frederick C. [email protected]