2015-08-19 2 views
0

Мне сложно создать метод, чтобы узнать, является ли пользователь частью группы. Существует модель для пользователя, группы и членства. Ниже приведены два метода (многие из которых я попытался, но не добился успеха).Как создать метод, чтобы узнать, является ли пользователь частью группы?

Как я могу создать метод, чтобы узнать, является ли пользователь членом группы? (Я хотел бы способ получения истинного или ложного результата.)

def member?(group_1) 
    if Membership.where(user_id: self.id, group_id: group_1.id) 
    return true 
    else 
    return false 
    end 
end 

def membership?(group) 
    Membership.where(user_id: self.id, group_id: group.id) 
end 

Вот атрибуты трех различных моделей:

create_table "groups", force: :cascade do |t| 
    t.string "name" 
end 

create_table "memberships", force: :cascade do |t| 
    t.integer "user_id" 
    t.integer "group_id" 
end 

create_table "users", force: :cascade do |t| 
    t.string "email" 
    t.string "first_name" 
    t.string "last_name" 
end 

Вот код в каждой соответствующей модели:

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class User < ActiveRecord::Base 
    has_many :memberships, dependent: :destroy 
    has_many :groups, through: :memberships 
end 

class Group < ActiveRecord::Base 
    has_many :memberships, dependent: :destroy 
    has_many :users, through: :memberships 
end 

ответ

1

Это должно работать для вас:

def member?(group) 
    groups.include?(group) 
end 
+0

Спасибо @dhouty! Этот метод работает. Я ценю, что вы нашли время ответить на мой вопрос. – Mauricio

0

Ваш текущий членство? метод возвращает массив. Если вы добавили .any? до конца, он вернет true или false.

def membership?(group) 
    Membership.where(user_id: self.id, group_id: group.id).any? 
end 

EDIT: ответ dhouty является наиболее точным - оставляя это здесь просто объяснить, почему ваш оригинальный метод не работает

+0

ha, я просто сказал ему что-то похожее: P –

0

не ответ, а просто сказать:

def member?(group_1) 
    if Membership.where(user_id: self.id, group_id: group_1.id) 
    return true 
    else 
    return false 
    end 
end 

Членство .where будет return [], если он не найдет никаких данных. Для этого [] does equal true, это означает, что ваш истинный блок всегда будет называться! Если вы хотите придерживаться логики, вам нужно спросить, содержит ли массив какие-либо данные. [].any?

Вам не нужно писать return, так как ruby ​​всегда возвращает последнее значение чего-либо.

// Изменение к вашей просьбе комментария:

Ya, вы можете пойти .гд() какой-то.? но imageine .where() вернет тысячу наборов данных, и вам просто нужно знать, есть ли только один ... Мы бы назвали этот «плохой код».

Лучшим решением было бы использовать find_by. Find_by возвращает первый соответствующий элемент. Membership.find_by(user_id: id, group_id. group_1.id)

хорошая вещь о find_by является тот факт, что он будет возвращать nil, если ничего не было найдено.Это означает, что вы можете сделать это

def member?(group_1) 
    !!Membership.find_by(user_id: id, group_id: group_1.id) 
end 

Find_by возвратит ноль или объект, с !! вы делаете объект к выражению true

+0

Спасибо @huan son за это понимание. Мне было любопытно узнать, почему мой метод возвращал данные, а не true или false. Теперь я узнал о коде «.any?» – Mauricio

+0

Я отредактировал мое сообщение для вас –

2

В отношении к вам вопрос создать метод, чтобы выяснить, пользователь является членом группы, Это должно работать нормально

В user.rb определить метод экземпляра

def membership?(group) 
    memberships.find_by(group: group).present? 
end 
+0

Спасибо @Rahul Singh! Этот метод отлично работает. – Mauricio

0

Вы можете сделать это двумя чистыми способами. (Вы можете либо или оба используют следующие)

1) приложение/модели/user.rb

class User < ActiveRecord::Base 
    # ... 
    # ... 
    def member_of_group?(group) 
    groups.exists?(group) 
    end 
end 

2) приложение/модели/groups.rb

class Group < ActiveRecord::Base 
    # ... 
    # ... 
    def has_user_member?(user) 
    users.exists?(user) 
    end 
end 

Тогда вы можете просто используйте следующие методы:

# If checking if a User object is member of a @group 
@user.member_of_group?(@group) 
=> returns true or false 

# If checking if a Group object has a member @user 
@group.has_user_member?(@user) 
=> returns true or false 
Смежные вопросы