2015-08-23 15 views
0

Это будет довольно быстро и легко для большинства из вас ... У меня есть таблица с именем types, а другая называется projects. Проект может иметь только один тип, но тип может иметь много проектов. Например, проект общинного сада и проект детской площадки могут иметь тип «зеленого пространства». Поэтому я создал ассоциацию has_many. В моей модели типа у меня есть это:Отношения не работают должным образом

has_many :projects 

и в моей модели проектов я ничего не имею (я ранее имел has_one в нем, но при взгляде на документы, казалось неправильным). В представлении # show show я бы хотел, чтобы имя отображаемого типа отображалось. В представлении проекта парка следует сказать «greenspace». но я получаю ошибку

undefined method `type' for #<Project:0x007ffdd14fcde8> 

Я пытаюсь получить доступ к этому имени, используя:

<h3>Type: <%= @project.type.project_type %> </h3> 

я также пытался:

<h3>Type: <%= @project.type_id.project_type %> </h3> 

но конечно type_id дает ряд, и для номера нет project_type. project_type - имя столбца, содержащего строковые данные 'greenspace'. Я обращаюсь к нему неправильно? Или я настроил его неправильно?

Кроме того, в моей схеме, проекты выглядит следующим образом:

create_table "projects", force: :cascade do |t| 
    t.string "type_id" 
    t.text  "description" 
    t.integer "money_needed" 
    t.integer "money_raised" 
    t.float "interest_offered" 
    t.datetime "end_date" 
    t.integer "user_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "name" 
    t.text  "url" 
end 

ответ

0

В модели проекта вы должны состояние:

belongs_to => :type 

В целом, для большинства ассоциаций там будет обратный. Не всегда, поскольку у вас могут быть несколько ассоциаций в Type for Project. Например, а также ваши текущие проекты has_many: projects, у вас могут быть другие, чтобы возвращать только незавершенные проекты, и такая ассоциация не нуждается в обратном.

Помните, что когда вы указываете: @ project.type Rails будет искать метод на @project. Связь является тем, что предоставляет этот метод, и эффективно результат - это объект типа, на который ссылается проект. Важно понимать, что @ project.type возвращает только тип, потому что ассоциация говорит ему: магия не позволяет просто вывести то, что нужно.

+0

Ну, я не опубликовал всю модель проекта. Проект должен принадлежать пользователю и иметь тип. Это что-то меняет? Или он может принадлежать более чем одной таблице, не будучи полиморфной, поскольку в моем понимании полиморфизма проект мог бы принадлежать экземпляру любой таблицы, но не в то же время, что ему нужно было бы – HolyMoly

+0

Я получил себя в довольно клубок с шестью таблицами, которые все должны иметь несколько ассоциаций:/ – HolyMoly

+0

спасибо, это сработало! Я собираюсь сделать еще больше googling сейчас lol :) – HolyMoly

1

Проект может принадлежать к обоим. Например,

#app/models/project.rb 
class Project < ActiveRecord::Base 
    belongs_to :type 
    belongs_to :user 
    #... 
end 

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :projects 
    #... 
end 

#app/models/type.rb 
class Type < ActiveRecord::Base 
    has_many :projects 
    #... 
end 
+0

да, после некоторого поиска в Google я настраивал его так, как если бы он не добавлял внешний ключ к обоим, поэтому он выглядит как '\t принадлежит_to: user,: foreign_key => 'user_id' '- благодарю вас за то, что вы спрыгнули, чтобы помочь прояснить это дальше. IDK, что бы я сделал без вас, на SO. Я уже нашел ответ на эту часть моего вопроса, но, возможно, кто-то еще найдет это полезным :) – HolyMoly

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