2013-11-13 2 views
5

У меня есть следующий код внутри моего контроллера:Закрытый метод выбрать называется для класса - Рельсы

array = Contact.select(:name).distinct

Идея заключается в том, что это может создать массив всех Contact моделей с уникальным :name атрибутом. Тем не менее, он бросает эту ошибку:

NoMethodError (private method 'select' called for Contact:Class)

Что недоразумение? Для чего это стоит, метод, вызывающий эту строку кода, не определен в контроллере как закрытый.

EDIT:

Вот фактический код:

Контроллер

class FluidsurveysController < ApplicationController 

    def index 
    end 

    def import_contacts 
    @survey_provider = FluidsurveysProviders::SurveyProvider.new() 

    @current_month = Time.new.strftime("%B%Y%d") 

    fs_contact_list_array = csv_to_array(params[:file].tempfile) 
    @fs_contacts_array = [] 

    fs_contact_list_array.each do |hash| 
     @fs_contacts_array << Contact.new(hash) 
    end 

    array = Contact.select(:name).distinct 
    end 
end 

Модель

class Contact 
    include ActiveModel::Model 
    attr_reader :client_id, :client_name, :branch_id, :branch, :short_name, :unit_id, :membership_id, 
       :first_name, :last_name, :date_of_birth, :change_date_time, :membership_type, 
       :home_phone, :email_address, :anniversary_years 


    def initialize(fs_contact_hash = {}) 
    @client_id = fs_contact_hash.fetch('ClientID') 
    @client_name = fs_contact_hash.fetch('ClientName') 
    @branch_id = fs_contact_hash.fetch('branchID1') 
    @branch = fs_contact_hash.fetch('branch') 
    @name = fs_contact_hash.fetch('ShortName') 
    @unit_id = fs_contact_hash.fetch('UnitID') 
    @membership_id = fs_contact_hash.fetch('MemberID') 
    @first_name = fs_contact_hash.fetch('FirstName') 
    @last_name = fs_contact_hash.fetch('LastName') 
    @date_of_birth = fs_contact_hash.fetch('DateOfBirth') 
    @change_date_time = fs_contact_hash.fetch('ChangeDateTime') 
    @membership_type = fs_contact_hash.fetch('MembershipType') 
    @home_phone = fs_contact_hash.fetch('HomePhone') 
    @email_address = fs_contact_hash.fetch('EMail1') 
    @anniversary_years = fs_contact_hash.fetch('Years') 
    end 
end 
+0

FWIW: ссылка Rails API указывает это точное использование в качестве примера: http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-distinct –

+0

Вы написали: «Не определено в * * контроллер ** как частный ", вы имели в виду ** модель ** вместо этого? –

+0

Нет, я имею в виду, что этот метод не является частным методом. Однако ни один из моих атрибутов модели не является закрытым. – Luigi

ответ

6

Основываясь на сообщении об ошибке, я уверен, ваша модель не является ActiveRecord Объект.

Если вы хотите использовать ActiveRecord#select, определите свою модель следующим образом.

class Contact < ActiveRecord::Base 

Кроме того, необходимо определить свои атрибуты в базе данных, а не с помощью attr_reader доступа к ним через ActiveRecord. См. http://guides.rubyonrails.org/getting_started.html#running-a-migration

+0

Если Арьян прав, [это] (http://stackoverflow.com/questions/16585677/why-is-there-a-private-objectselect-where-are-the-public-select-methods-comin) может помочь объясните ошибку дальше. –

+1

Это так ... Спасибо за дополнительное объяснение, чтобы продолжить мое обучение. – Luigi

5

Вы, кажется, используете старую версию Rails, в частности версию 2.3.whatever. Там метод select действительно является приватным для классов модели ActiveRecord (поскольку он унаследован от модуля Kernel, который является частью каждого объекта Ruby и выполняет совершенно другую цель), и поэтому он не предназначен для использования, как это делается в Rails 3 и Rails 4.

В Rails 2.3, вы можете достичь подобных результатов, используя следующий синтаксис:

Contact.all(:select => "DISTINCT name") 

Это возвращает массив контактов, которые имеют набор только имя атрибута.

+0

@Luigi Если бы вы ввели полную трассировку стека вашей ошибки, это было бы более ясным. –

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