2013-06-30 3 views
0

У меня есть две модели - «символы» и «пользователи». Среди других атрибутов символы имеют атрибуты «created_by_id» и «updated_by_id», которые являются идентификаторами пользователей, которые создали/обновили определенную запись символа.Несколько вложенных атрибутов одного типа

Предположим, что я хочу отобразить таблицу символов с их атрибутом «символ» и вложенными атрибутами «созданный» и «обновленный» (user.username) для каждой записи символа. Результирующая таблица должна выглядеть примерно так:

symbol  created_by updated_by 
------------------------------------ 
symbol1 username1  username2 
symbol2 username1  username2 

Как я могу это достичь? Я думаю, мне нужно accepts_nested_attributes_for :user и, возможно, has_one :user (?) В моей модели Symbol. Нужно ли мне также belongs_to :user в моей модели пользователя?

После того, как модели настроены правильно, как я могу получить доступ к имени пользователя, связанного с «created_by_id» и «updated_by_id», на мой взгляд?

У меня есть форма редактирования, где я использовал вложенную форму, как это (который прекрасно работает):

<%= form_for @symbol do |f| %> 
    Symbol: 
    <%= f.text_field :symbol %> 
    <%= f.fields_for :kanji do |kf| %> 
    Meaning: 
    <%= kf.text_field :meaning %> 

    Onyomi: 
    <%= kf.text_field :onyomi %> 

    Kunyomi: 
    <%= kf.text_field :kunyomi %> 
    <% end %> 
    <%= f.submit "Save" %> 
<% end %> 

, но я не мог понять, как сделать что-то подобное в этом случае, когда у меня есть два вложенных атрибутов связанных с одним и тем же символом.

Я новичок в рельсах, поэтому, возможно, я понял, как это сделать неправильно. Если есть что-то лучше, чем я только что объяснил, как я хочу это сделать, пожалуйста, поправьте меня.

Редактировать: Вот модели. Первый из них на самом деле называется JSymbol, но проблема остается прежней.

class JSymbol < ActiveRecord::Base 
    belongs_to :j_symbol_type 
    has_one :kanji, :dependent => :destroy 
    has_one :radical, :dependent => :destroy 
    has_one :vocabulary, :dependent => :destroy 

    attr_accessible :created_by_id, :updated_by_id, :symbol, :j_symbol_type_id, :level 
    attr_accessible :kanji_attributes, :radical_attributes, :vocabulary_attributes 

    accepts_nested_attributes_for :kanji, :radical, :vocabulary 
end 

И модель пользователей.

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable, :timeoutable 

    attr_accessible :username, :email, :password, :password_confirmation, :remember_me 

    validates :username, :presence => true, :uniqueness => true 
end 

Это, конечно, без пользовательского jsymbol отношения, так как я не знаю, какого рода отношения, чтобы добавить там .. Это должно быть что-то вроде has_one :user в модели JSymbol и belongs_to :j_symbol в модели пользователя, кроме этого нужно сделайте дважды как-то .. Существует также вопрос вызова метода .build в методе действий для каждого символа.

+0

, вероятно, не лучшим образом, я решил это с sendind значение для помощника, находя пользователя и вернуть имя этого пользователя. – rmagnum2002

+0

да, я подумал об этом, но для страницы из 10 предметов я бы выполнил 20-разрядные запросы только для получения всех имен пользователей .. так что это последнее мое средство. спасибо за ответ, хотя. – pootzko

+0

опубликуйте модель 'user' и' symbol', пожалуйста, часть с реляциями между ними – rmagnum2002

ответ

0

После rmagnum2002 заставил меня понять, что я мог бы использовать foreign_key параметр здесь, я начал прибегая к помощи «рельсы несколько внешний ключ к одной таблице», наткнулся на кучу устаревших SO ответов, которые Бесполезный и я нашел this article, который помог мне написать код, который работает.

Таким образом, это отношение, которое я вложил в мою JSymbol модель:

belongs_to :created_by, :class_name => User, :foreign_key => "created_by_id" 
belongs_to :updated_by, :class_name => User, :foreign_key => "updated_by_id" 

и это одно из модели пользователей:

has_many :occurances_as_created_by, :class_name => JSymbol, :foreign_key => "created_by_id" 
has_many :occurances_as_updated_by, :class_name => JSymbol, :foreign_key => "updated_by_id" 

Я не должен ничего добавлять в моем метод действия, и вот что я положил в поле зрения:

<%= j_symbol.created_by.username %> 
<%= j_symbol.updated_by.username %> 

Это то, что происходит в SQL, если кто-то заинтересован (Что означает, что он фактически делает это через отдельные запросов на выборку, а не присоединяется, так что я, возможно, еще продолжают искать лучшее решение):

JSymbol Load (0.3ms) SELECT "j_symbols".* FROM "j_symbols" 
JSymbolType Load (0.3ms) SELECT "j_symbol_types".* FROM "j_symbol_types" 
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 7 LIMIT 1 
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 8 LIMIT 1 
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 8 LIMIT 1 
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 8 LIMIT 1 
Rendered j_symbols/index.html.erb within layouts/j_symbols (7.8ms) 
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 8 LIMIT 1 
1

Что-то, как это должно работать:

class Symbol < ActiveRecord::Base 
    has_many :creators, class_name: "User", 
          foreign_key: "created_by_id" 
    has_many :updaters, class_name: "User", 
          foreign_key: "updated_by_id" 

    belongs_to :creator, class_name: "User" 
end 

затем использовать:

symbol | symbol.creator.name | symbol.updater.name 

еще, я пытаюсь это на мое приложение, так что я не уверен, что 100% об этом.

EDIT

class Symbol < ActiveRecord::Base 
    has_one :creator, :class_name => User, :foreign_key => 'created_by_id' 
    has_one :updater, :class_name => User, :foreign_key => 'updated_by_id' 
end 
+0

Я попробую. Вы добавили что-либо к методу действий для извлечения этих пользователей? – pootzko

+0

не уверен, что должно быть в вашем случае, 'has_one' или' has_many', зависит от вашего приложения. – rmagnum2002

+0

+1 за то, что помогли мне встать на правильный путь с идеей foreign_key. – pootzko

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