Есть ли в динамических методах поиска find_or_create Rails 3 Active Record недокументированные несоответствия? - PullRequest
3 голосов
/ 15 января 2011

Извините за длинный заголовок, но это беспокоит меня.Я новичок в Rails, так что это мой первый проект.Rails 3.0.3.

В моей модели User может читать или не читать много Entries;это отслеживается в модели под названием ReadEntries.Я думаю, что это отношение многие к одному правильно определено в коде.

User.rb:

has_many :read_entries

Entry.rb:

has_many :read_entries

ReadEntry.rb:

belongs_to :entry
belongs_to :user

Эта таблица должна быть заполнена в какой-то момент.Если я пытаюсь сделать это:

user.read_entries.find_or_create_by_entry_id(entry.id, :read => false)

Я получаю ошибку Unknown key(s): read.Не пытайтесь установить :read, и это будет работать.

Однако, если я создаю ту же строку с этим, это работает:

ReadEntry.find_or_create_by_entry_id_and_user_id(entry.id, user.id, :read => false)

Логически, эти методы должны быть идентичны,право?Спасибо.

Ответы [ 2 ]

1 голос
/ 29 марта 2011

У меня также был странный опыт с find_or_create.Мне бы понравилось, если бы это сработало, но это кажется противоречивым.

В настоящее время у меня та же проблема, что и у вас, и я думаю, что это может быть связано с вызовом find_or_create для ассоциации, а не для модели напрямую.Вот мой пример:

    permission_assignments.find_or_create_by_role_id(:role_id => role_id, :is_allowed => false)

Это работает для создания назначения, за исключением того, что для поля is_allowed установлено значение по умолчанию "true".Этот код работает для меня (в модели разрешений, отсюда и собственная ссылка)

    PermissionAssignment.find_or_create_by_permission_id_and_role_id(:permission_id => self.id, :role_id => role_id, :is_allowed => false)

К сожалению, он более многословен, но работает.Единственная проблема, которую я до сих пор замечаю, заключается в том, что возвращаемому объекту не присвоен идентификатор (однако запись создается в базе данных, однако, если бы я захотел обновить какие-либо атрибуты, я бы не смог без идентификатора),Не знаю, является ли это отдельной проблемой или нет.

Rails 3.0.4 здесь с Postgres 8.4

1 голос
/ 15 января 2011

Вы не можете передавать другие поля подобным образом, так как Rails будет считать, что они являются опциями для поиска. Вместо этого вам нужно сделать вызов метода длиннее:

user.read_entries.find_or_create_by_entry_id_and_read(entry.id, false)

Или используйте для этого более короткий, специальный синтаксис.

В вашем последнем примере я думаю, что Rails возьмет второй аргумент и использует его в качестве опции. Кроме этого, я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...